···11+# Copy to `.env` and fill in.
22+33+# ---------------------------------------------------------------------------
44+# OG image URL signing secret. nuxt-og-image renders OG images on demand at
55+# runtime; this HMAC secret signs the generated URLs so callers can't craft
66+# arbitrary image-generation requests against the endpoint (which would burn
77+# CPU and bandwidth).
88+#
99+# Generate with: npx nuxt-og-image generate-secret
1010+# (or any 32-byte hex string — the CLI just calls randomBytes(32).toString('hex'))
1111+# ---------------------------------------------------------------------------
1212+NUXT_OG_IMAGE_SECRET=<32-byte hex string>
1313+1414+# ---------------------------------------------------------------------------
1515+# Public URL the app is reachable at. For local dev this is the loopback host
1616+# (note: 127.0.0.1, not localhost — required by the AT Proto OAuth spec for
1717+# the synthetic dev `client_id`).
1818+# ---------------------------------------------------------------------------
1919+NUXT_PUBLIC_URL=http://127.0.0.1:3000
2020+2121+# ---------------------------------------------------------------------------
2222+# Database. Get a connection string from https://neon.tech (free tier is fine).
2323+# Copy the "pooled" connection string for serverless workloads.
2424+# ---------------------------------------------------------------------------
2525+NUXT_DATABASE_URL=postgres://user:password@host.neon.tech/dbname?sslmode=require
2626+2727+# ---------------------------------------------------------------------------
2828+# AT Proto OAuth client signing key (ES256 private JWK).
2929+# Generate with: pnpm gen:jwk
3030+# Paste the full JSON object on a single line below.
3131+# ---------------------------------------------------------------------------
3232+NUXT_ATPROTO_PRIVATE_JWK={"kty":"EC","kid":"...","crv":"P-256","x":"...","y":"...","d":"..."}
3333+3434+# ---------------------------------------------------------------------------
3535+# Application encryption key (KEK) — wraps SSH private keys and AT Proto
3636+# session blobs at rest. Base64-encoded 32 bytes.
3737+# Generate with: pnpm gen:encryption-key
3838+# ---------------------------------------------------------------------------
3939+NUXT_ENCRYPTION_KEY=<base64-encoded 32 bytes>
4040+4141+# ---------------------------------------------------------------------------
4242+# GitHub App credentials. After creating the App at
4343+# https://github.com/settings/apps/new, copy:
4444+# - The numeric App ID (top of the App settings page).
4545+# - The webhook secret you set during creation.
4646+# - A generated private key (.pem). On Vercel, store with literal "\n" in
4747+# place of newlines; locally, keep the real newlines.
4848+# ---------------------------------------------------------------------------
4949+NUXT_GITHUB_APP_ID=<numeric app id>
5050+NUXT_GITHUB_WEBHOOK_SECRET=<webhook secret>
5151+NUXT_GITHUB_APP_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
5252+...
5353+-----END RSA PRIVATE KEY-----
5454+"
5555+5656+# ---------------------------------------------------------------------------
5757+# Cron secret — protects the worker tick endpoint (`/api/jobs/run`) from
5858+# unauthenticated callers. In prod, Vercel Cron sends this automatically;
5959+# locally, `pnpm jobs:tick` reads it from this env var.
6060+# Generate with: pnpm gen:cron-secret
6161+# ---------------------------------------------------------------------------
6262+NUXT_CRON_SECRET=<base64url-encoded 32 bytes>
6363+6464+# Optional: per-invocation worker time budget in milliseconds.
6565+# Default 25_000. Set lower in dev so `pnpm jobs:tick` returns sooner when
6666+# the queue is empty.
6767+# NUXT_WORKER_BUDGET_MS=5000