| Variable |
Default |
Meaning |
PORT |
8080 |
Listen port. |
JWT_SECRET |
dev-secret-do-not-use-in-production |
Token signing secret. A value not starting with dev-secret puts the server into “production posture”. |
GROVEBACK_PROJECT_ID |
proj_dev |
The single project id to mount. |
GROVEBACK_MULTI_PROJECT |
off |
1/true serves every active control-plane project from one instance, routed by the token’s pid. |
MONGO_URL |
— |
Use MongoDB instead of in-memory storage. Must be a replica set for realtime. |
REDIS_URL |
— |
BullMQ queue for background triggers and cron. Unset means functions run inline with no persistent queue. |
APP_URL |
http://localhost:<PORT>/dashboard |
Where Stripe checkout and portal return the browser. |
GROVEBACK_BASE_URL |
— |
This server’s public URL; OAuth redirect_uris point here. |
GROVEBACK_SECRET_KEY |
— |
Master key encrypting integration and BYO secrets at rest. Required in production. |
GROVEBACK_POLICIES_FILE |
groveback.policies.json |
File-based default collection policies. |
GROVEBACK_OPERATORS |
empty |
Comma-separated emails allowed to use /api/v1/control/admin/*. Unset means those routes fail closed. |
GROVEBACK_CLOUD |
false |
true makes BYO Mongo enforce the SSRF guard and require TLS. The default suits self-hosting, where localhost clusters are normal. |
GROVEBACK_BYO_MAX_CLIENTS |
50 |
LRU cap on cached per-project BYO Mongo clients. |
| Variable |
Default |
Meaning |
GROVEBACK_DEV_ADMIN_KEY |
— |
Install a known admin key at boot. Refused in a production posture unless GROVEBACK_DEV=1. |
GROVEBACK_DEV |
— |
1 asserts “this really is a dev server”, so an inherited JWT_SECRET does not block the dev key. Set by grove dev. |
GROVEBACK_LOCAL_STATUS |
— |
Path to the snapshot the dashboard’s Local section reads. Set by grove dev. |
| Variable |
Default |
Meaning |
S3_ENDPOINT |
— |
Enables the S3 blob backend. All three of endpoint, key and secret must be set, or S3 is off. |
S3_ACCESS_KEY_ID |
— |
|
S3_SECRET_ACCESS_KEY |
— |
|
S3_BUCKET |
groveback |
|
S3_REGION |
— |
|
GROVEBACK_MAX_FILE_SIZE |
10485760 (10 MB) |
Per-file upload cap in bytes. Mongo-backed blobs additionally cap at the 16 MB BSON limit. |
| Variable |
Default |
Meaning |
GROVEBACK_FUNCTION_TIMEOUT_MS |
10000 |
Per-run execution timeout. |
GROVEBACK_FUNCTION_PRE_TIMEOUT_MS |
2000 |
Per-hook timeout for pre-write hooks. |
GROVEBACK_FUNCTION_PRE_CHAIN_BUDGET_MS |
5000 |
Cap on a whole pre-hook chain. |
GROVEBACK_FUNCTION_POOL_SIZE |
internal |
Worker pool size. |
GROVEBACK_FUNCTION_MAX_WAITERS |
poolSize * 8 |
Queue depth cap; beyond it runs are rejected immediately (HTTP 503). |
GROVEBACK_FUNCTION_QUEUE_TIMEOUT_MS |
5000 |
Budget for waiting on a free worker — separate from the run timeout, so waiting never eats a function’s own time. |
| Variable |
Default |
Meaning |
EMBEDDINGS_URL |
— |
A local TEI or OpenAI-compatible endpoint. |
EMBEDDINGS_DIM |
384 |
Local model dimensions. |
EMBEDDINGS_MODEL |
text-embeddings-inference |
Local model name. |
EMBEDDINGS_PROVIDER |
local when EMBEDDINGS_URL is set, else mock |
Default provider. |
OPENAI_API_KEY |
— |
Opt into the OpenAI provider. |
VOYAGE_API_KEY |
— |
Opt into the Voyage provider. |
| Variable |
Default |
Meaning |
RESEND_API_KEY |
— |
Enables transactional email. Without it, the email-verification gate is disabled rather than locking users out. |
RESEND_FROM |
— |
From address. |
RESEND_API_URL |
Resend’s default |
Override the API base URL. |
| Variable |
Default |
Meaning |
STRIPE_SECRET_KEY |
— |
Unset means billing is disabled and nothing is limited — the self-host default. |
GROVEBACK_BILLING |
enabled |
0/false forces billing off even with a Stripe key. |
STRIPE_PRICE_PRO · STRIPE_PRICE_SCALE |
— |
Recurring price ids per plan. |
STRIPE_WEBHOOK_SECRET |
— |
Without it every delivery to /api/v1/billing/webhook is rejected and upgrades never apply. |
STRIPE_API_URL |
https://api.stripe.com |
For a Stripe-compatible backend. |
STRIPE_WEBHOOK_DEBUG |
— |
1/true dumps every delivery’s headers and raw body. Troubleshooting only — that body is unauthenticated input. |
| Variable |
Default |
Meaning |
GROVEBACK_COMMIT |
null |
Commit sha reported at /api/v1/health. |
CHART_VERSION |
null |
Helm chart version, same endpoint. |
Not read by the backend.
| Variable |
Read by |
Meaning |
GROVE_ADMIN_KEY |
the CLI |
The admin key for gen, pull, push, seed, status. |
GROVE_URL |
the generated client |
Overrides the baked URL at runtime, so one committed client serves local and production. |
GROVEBACK_URL · GROVEBACK_API_KEY · GROVEBACK_MCP_READONLY |
the MCP server |
See the MCP reference. |
A JWT_SECRET that does not start with dev-secret puts the server into production posture,
which changes two behaviors:
GROVEBACK_DEV_ADMIN_KEY is refused unless GROVEBACK_DEV=1. A known admin key on a
production deployment is not a warning-level mistake.
GROVEBACK_SECRET_KEY becomes required — without it, stored secrets cannot be decrypted.
If you are working from an old .env.example, these are no longer read anywhere:
OAUTH_GOOGLE_CLIENT_ID, OAUTH_GOOGLE_CLIENT_SECRET, OAUTH_GITHUB_CLIENT_ID,
OAUTH_GITHUB_CLIENT_SECRET, GROVEBACK_OAUTH_REDIRECTS. OAuth is configured
per project now.
MINIO_ROOT_USER and MINIO_ROOT_PASSWORD are consumed by Docker Compose, not the server.