Skip to main content

Configuration reference

This page lists every variable of the supported self-hosted Compose stack in docker/self-host. It is generated from the application's configuration files, its configuration metadata, the Compose files of that stack, and its .env.example.

A Required variable stops Compose or the application when it is unset. Configuration readiness reports the settings that a running instance still needs.

Application settings in .env​

Compose forwards these variables to the Java containers, where Spring binds them to the setting in the second column. The description comes from the application's configuration metadata.

VariableSettingDefaultRequiredServicesDescription
AGENT_ENABLEDhephaestus.agent.enabledfalseapplication-server, application-workerTurns on agent jobs, which run practice reviews. The server role submits jobs and the worker role runs them, so set it on both.
AGENT_MAX_CONCURRENT_COMPOSITIONShephaestus.agent.max-concurrent-compositions16application-workerThe most review attempts one worker runs at once. An attempt composes its feedback after its sandbox ends, and then it holds no sandbox slot. Thus this setting bounds the concurrent compositions. The sandbox slots still bound the attempts that hold a sandbox. A value below the sandbox slots also lowers the sandboxes in use.
DEPLOYMENT_ENVIRONMENThephaestus.release.environmentlocalapplication-server, application-worker, webapp, webhook-serverThe name of this deployment, such as production. The webapp, log lines and traces use the same name.
GH_APP_CLIENT_IDhephaestus.integration.github.app.client-idapplication-serverThe App's client ID, which exchanges the code GitHub returns when an installation requests user authorization.
GH_APP_CLIENT_SECREThephaestus.integration.github.app.client-secretapplication-serverThe client secret of the GitHub App. Set it together with the client ID.
GH_APP_IDhephaestus.integration.github.app.id0application-server, application-workerID of the GitHub App. The value 0 turns GitHub App mode off. Must not be negative.
GH_APP_INSTALLATION_URLhephaestus.integration.github.app.installation-urlapplication-serverURL where users install the GitHub App, such as https://github.com/apps/my-app/installations/new.
GH_APP_PRIVATE_KEYhephaestus.integration.github.app.private-keyapplication-server, application-workerPEM-encoded private key of the GitHub App, as an inline value.
GH_APP_PRIVATE_KEY_LOCATIONhephaestus.integration.github.app.private-key-locationapplication-server, application-workerResource location of the private key file of the GitHub App. It takes precedence over the inline key.
GH_AUTH_TOKENhephaestus.contributors.github.auth-token
hephaestus.integration.github.meta.auth-token
application-server, application-workerPersonal access token or fine-grained token used for unauthenticated-ish reads of the hephaestus-build/Hephaestus contributor graph. personal access token or fine-grained token for API access.
GH_OAUTH_CLIENT_IDhephaestus.auth.login-providers.github.client-idapplication-serverClient ID of the GitHub OAuth App for sign-in. Set it with its client secret: a provider with only one of the two is not seeded. It seeds the github login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GH_OAUTH_CLIENT_SECREThephaestus.auth.login-providers.github.client-secretapplication-serverClient secret of the GitHub OAuth App for sign-in. Set it with its client ID. It seeds the github login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GIT_CHECKOUT_ENABLEDhephaestus.git.enabledfalseapplication-server, application-workerKeeps local Git mirrors of monitored repositories, which practice reviews read code from. Turn it on wherever agent jobs run. Without it, the practice review health check reports out of service.
GIT_MAX_CONCURRENT_INGESTIONShephaestus.git.max-concurrent-ingestions2application-server, application-workerHow many captured commits are written to PostgreSQL at once.
GIT_MAX_SNAPSHOT_BYTEShephaestus.git.max-snapshot-bytes8589934592application-server, application-workerThe most disk that the checkout and reachable history of one review may use. Hephaestus refuses a larger repository whole and does not capture part of it.
GITLAB_DEFAULT_SERVER_URLhephaestus.integration.gitlab.default-server-url${GITLAB_OAUTH_BASE_URL}application-server, application-workerThe GitLab server URL for a workspace that names no server of its own.
GITLAB_ENABLEDhephaestus.integration.gitlab.enabledfalseapplication-server, application-workerTurns on the GitLab integration, which syncs GitLab groups and projects and delivers feedback on merge requests.
GITLAB_OAUTH_BASE_URLhephaestus.auth.login-providers.gitlab.base-url
hephaestus.integration.gitlab.default-server-url
https://gitlab.comapplication-server, application-workerOrigin of the GitLab instance for sign-in, such as https://gitlab.example.com. It seeds the gitlab login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers. The GitLab server URL for a workspace that names no server of its own.
GITLAB_OAUTH_CLIENT_IDhephaestus.auth.login-providers.gitlab.client-idapplication-serverClient ID of the GitLab OAuth application for sign-in. Set it with its client secret: a provider with only one of the two is not seeded. It seeds the gitlab login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GITLAB_OAUTH_CLIENT_SECREThephaestus.auth.login-providers.gitlab.client-secretapplication-serverClient secret of the GitLab OAuth application for sign-in. Set it with its client ID. It seeds the gitlab login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GITLAB_OAUTH_DISPLAY_NAMEhephaestus.auth.login-providers.gitlab.display-nameGitLabapplication-serverLabel of the GitLab button on the sign-in or account-linking page. It seeds the gitlab login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GITLAB_WORKSPACE_CREATIONhephaestus.features.flags.gitlab-workspace-creationfalseapplication-serverLets admins create GitLab workspaces in the UI and the API.
HEPHAESTUS_AGENT_IMAGE_REQUIRE_DIGESThephaestus.agent.image.require-digesttrueapplication-server, application-worker, webhook-serverRefuses startup unless the agent image reference is pinned by digest.
HEPHAESTUS_AUTH_ASSURANCE_ENFORCEDhephaestus.auth.assurance-enforcedtrueapplication-serverRequires passkey verification and a recent sign-in for protected admin actions. Turn it off only on an isolated test instance.
HEPHAESTUS_AUTH_BOOTSTRAP_ADMINShephaestus.auth.bootstrap-adminsapplication-serverIdentities that become instance admins when they sign in, as provider:@username or provider:subject. Use the subject where a username can be claimed again. Email addresses are never matched.
HEPHAESTUS_AUTH_BOOTSTRAP_TOKENhephaestus.auth.bootstrap-tokenapplication-serverOptional token, controlled by the deployment, that recovers an instance without an active admin. A blank value turns off the recovery endpoint.
HEPHAESTUS_AUTH_BROWSER_EXTENSION_IDShephaestus.auth.browser-extension-idsapplication-serverChrome extension IDs that may sign in as installed clients. Each ID gets exactly one callback and one CORS origin.
HEPHAESTUS_AUTH_PASSKEYS_ALLOWED_ORIGINShephaestus.auth.passkeys.allowed-originsapplication-serverBrowser origins that may register and use passkeys, as a comma-separated list. Each must be an HTTPS origin on the RP ID or one of its subdomains. When it is empty, the origin of the auth issuer is used.
HEPHAESTUS_AUTH_PASSKEYS_INSTANCE_ADMIN_REQUIREDhephaestus.auth.passkeys.instance-admin-requiredtrueapplication-serverRequires a verified passkey sign-in from every instance admin. Workspace and account settings cannot turn this off.
HEPHAESTUS_AUTH_PASSKEYS_RP_IDhephaestus.auth.passkeys.rp-idapplication-serverWebAuthn relying party ID, the domain that passkeys are bound to. When it is empty, the host of the auth issuer is used. Passkeys registered under one RP ID do not work under another.
HEPHAESTUS_AUTH_PASSKEYS_WORKSPACE_ADMIN_REQUIREDhephaestus.auth.passkeys.workspace-admin-requiredfalseapplication-serverRequires a verified passkey sign-in for workspace administration in every workspace. A workspace cannot turn this off.
HEPHAESTUS_AUTH_STATE_COOKIE_KEYhephaestus.auth.state-cookie-keyyesapplication-serverBase64-encoded 32-byte AES key that seals the OAuth state and sign-in intent cookies. Required outside development.
HEPHAESTUS_EMAIL_FROMhephaestus.email.fromapplication-serverThe sender address in the envelope and the header. Required when spring.mail.host is set. The relay must be allowed to send for its domain through SPF and DKIM.
HEPHAESTUS_EMAIL_FROM_NAMEhephaestus.email.from-nameHephaestusapplication-serverThe display name shown next to from.
HEPHAESTUS_EMAIL_RATE_LIMIT_DAILY_CAPACITYhephaestus.email.rate-limit.daily-capacity250application-serverMost emails this instance sends per day. Hephaestus does not send an email above this limit.
HEPHAESTUS_EMAIL_RATE_LIMIT_OPTIONAL_DAILY_CAPACITYhephaestus.email.rate-limit.optional-daily-capacity200application-serverMost optional emails, such as digests and survey invitations, this instance sends per day. Optional emails also count toward daily-capacity. Must be lower than daily-capacity.
HEPHAESTUS_EMAIL_REPLY_TOhephaestus.email.reply-toapplication-serverThe address that receives human replies. When it is blank, replies go to the sender address.
HEPHAESTUS_IMAGE_AGENT_PIhephaestus.agent.image.referenceyesapplication-server, application-worker, webhook-serverImage reference used by Pi practice sandboxes and the Hephaestus container. Production must be digest-pinned (registry/path@sha256:<64 lowercase hex>).
HEPHAESTUS_IMAGE_APPLICATION_SERVERhephaestus.release.imageyesapplication-server, application-worker, database-migration, webhook-serverThe digest reference of the image that this container started from. It is empty outside a deployment from a release lock.
HEPHAESTUS_INTEGRATION_CONSUMER_INACTIVE_THRESHOLDhephaestus.integration.consumer.inactive-threshold30dapplication-serverHow long JetStream keeps a durable consumer that no running process is bound to before it deletes it. Set 0s to disable deletion, otherwise use at least 1h. A recreated consumer skips the messages that arrived while it was gone.
HEPHAESTUS_INTEGRATION_OUTLINE_ALLOWED_ORIGINShephaestus.integration.outline.allowed-originsapplication-server, application-worker, webhook-serverOutline origins that workspace connections and Outline sign-in may use, as a comma-separated list such as https://wiki.example.com. Each must be an HTTPS origin without a path. Hephaestus refuses every Outline address that is not listed.
HEPHAESTUS_INTEGRATION_OUTLINE_ENABLEDhephaestus.integration.outline.enabledfalseapplication-server, application-worker, webhook-serverTurns on the Outline integration, which lets workspaces connect Outline and syncs its documents. Each workspace admin still connects their workspace separately.
HEPHAESTUS_INTEGRATION_SLACK_CLIENT_IDhephaestus.auth.login-providers.slack.client-id
hephaestus.integration.slack.client-id
application-serverClient ID of the Slack app for linking a Slack account. It falls back to the Slack workspace-install credentials. Set it with its client secret: a provider with only one of the two is not seeded. It seeds the slack login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers. Slack OAuth client id used by SlackOAuthClient during oauth.v2.access.
HEPHAESTUS_INTEGRATION_SLACK_CLIENT_SECREThephaestus.auth.login-providers.slack.client-secret
hephaestus.integration.slack.client-secret
application-serverClient secret of the Slack app for linking a Slack account. It falls back to the Slack workspace-install credentials. Set it with its client ID. It seeds the slack login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers. Slack OAuth client secret used by SlackOAuthClient during oauth.v2.access.
HEPHAESTUS_INTEGRATION_SLACK_ENABLEDhephaestus.integration.slack.enabledfalseapplication-server, application-worker, webhook-serverMaster toggle for the Slack integration (OAuth install, lifecycle listeners, outbound messaging).
HEPHAESTUS_INTEGRATION_SLACK_REDIRECT_URIhephaestus.integration.slack.redirect-uriapplication-serverRedirect URI registered on the Slack app. It must match the authorization URL that Hephaestus builds for the Slack connection.
HEPHAESTUS_INTEGRATION_SLACK_SIGNING_SECREThephaestus.integration.slack.signing-secretapplication-server, webhook-serverSigning secret of the Slack app, which verifies inbound Events API and interactivity requests. Required when the Slack integration is on, or the server and webhook roles do not start.
HEPHAESTUS_LLM_DISPLAY_CURRENCYhephaestus.llm.display-currencyapplication-serverCode of the second currency in which spend in USD is also shown. Empty shows USD only.
HEPHAESTUS_LLM_EGRESS_ALLOW_LOOPBACKhephaestus.llm.egress.allow-loopbackfalseapplication-server, application-workerAccepts provider base URLs on http://localhost. Use it only in local development, because it lets a workspace admin send provider requests to services on the host. The private, link-local and CGNAT checks still apply.
HEPHAESTUS_LLM_EGRESS_PRIVATE_HOSTShephaestus.llm.egress.private-hostsapplication-server, application-workerModel endpoints on private networks that provider base URLs may use, as host names, IP addresses or CIDR ranges. A host name entry lets that name resolve to a private address. A range admits every host name that resolves into it. Only private addresses qualify: loopback, link-local and the known cloud metadata ranges stay blocked. A range wider than /16 (IPv4) or /48 (IPv6), outside the private ranges, or covering this server's own address stops startup. Empty allows public hosts only.
HEPHAESTUS_LLM_EGRESS_PRIVATE_HOSTS_ALLOW_HTTPhephaestus.llm.egress.private-hosts-allow-httpfalseapplication-server, application-workerAccepts http:// base URLs whose host is in private-hosts. Every other host still needs HTTPS.
HEPHAESTUS_LLM_FX_DAILY_URLhephaestus.llm.fx.daily-urlhttps://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xmlapplication-serverOverridable so an air-gapped instance can point at a local ECB mirror.
HEPHAESTUS_LLM_USAGE_RETENTIONhephaestus.llm.usage.retentionP400Dapplication-serverAge from occurred_at at which a ledger row is deleted. Operator-tunable because the ledger is accounting data: a commercial or tax retention obligation can run years beyond the default, and the deletion is irreversible.
HEPHAESTUS_PUBLIC_ACTIVITY_ENABLEDhephaestus.public-activity.enabledfalseapplication-serverAllows public activity pages on this instance until an instance admin changes the switch in the admin console. Each workspace must also opt in.
HEPHAESTUS_PUBLIC_ACTIVITY_REPOSITORY_VISIBILITY_MAX_AGEhephaestus.public-activity.repository-visibility-max-age48happlication-serverHow recently a sync must have confirmed that a repository is public for its work to appear on public activity pages. Must be positive. Accepts 48h, 2d, PT48H.
HEPHAESTUS_RATE_LIMIT_PUBLIC_ACTIVITY_CAPACITYhephaestus.auth.rate-limit.public-activity.capacity60application-serverMost requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_RATE_LIMIT_PUBLIC_ACTIVITY_PERIODhephaestus.auth.rate-limit.public-activity.period1mapplication-serverRefill window of the limit. Must be positive.
HEPHAESTUS_RELEASE_CHECK_ENABLEDhephaestus.release.check-enabledtrueapplication-serverWhether the server role may ask GitHub for the newest published release.
HEPHAESTUS_RELEASE_COMMIThephaestus.release.commitapplication-server, application-worker, webhook-serverThe source commit that the release lock names. It is empty outside a deployment from a release lock.
HEPHAESTUS_RESEARCH_ORGANIZATIONhephaestus.consent.research-organizationapplication-serverName of the organization that runs a research study on this instance. When it is set, first-login setup and account settings ask users for research consent. At most 255 characters.
HEPHAESTUS_SECURITY_CREDENTIAL_ENCRYPTION_KEYhephaestus.security.credential-encryption-keyyesapplication-server, application-workerActive key that encrypts the stored credentials of integration connections. Exactly 32 bytes, so 32 ASCII characters. Required in production.
HEPHAESTUS_SECURITY_CREDENTIAL_ENCRYPTION_KEY_VERSIONhephaestus.security.credential-encryption-key-version1application-server, application-workerPositive version number stored with each credential that the active credential key encrypts. Must differ from prior-credential-encryption-key-version.
HEPHAESTUS_SECURITY_CREDENTIAL_ROTATION_ENABLEDhephaestus.security.credential-rotation-enabledfalseapplication-server, application-workerRe-encrypts stored credentials with the active credential key in batches on the server role. Requires both the active and the prior credential key.
HEPHAESTUS_SECURITY_ENCRYPTION_KEYhephaestus.security.encryption-keyyesapplication-server, application-workerKey that encrypts sensitive values at rest, such as login provider secrets, LLM connection keys and JWT signing keys. Exactly 32 bytes, so 32 ASCII characters. Required in production.
HEPHAESTUS_SECURITY_PRIOR_CREDENTIAL_ENCRYPTION_KEYhephaestus.security.prior-credential-encryption-keyapplication-server, application-workerPrevious credential key, still used to decrypt credentials stored under its version during a key rotation. Exactly 32 bytes. Set it together with prior-credential-encryption-key-version.
HEPHAESTUS_SECURITY_PRIOR_CREDENTIAL_ENCRYPTION_KEY_VERSIONhephaestus.security.prior-credential-encryption-key-versionapplication-server, application-workerVersion number of the previous credential key. Set it together with prior-credential-encryption-key.
HEPHAESTUS_TRUSTED_PROXIESserver.tomcat.remoteip.internal-proxies172\.29\.47\.2application-server, application-worker, webhook-serverInternal proxies that are to be trusted. Can be set as a comma separate list of CIDR or as a regular expression.
HEPHAESTUS_WEBHOOK_STREAM_ALLOW_DESTRUCTIVE_LIMIT_UPDATEShephaestus.webhook.stream.allow-destructive-limit-updatesfalsewebhook-serverLets startup apply a limit change that deletes messages that the stream already holds. A smaller bound deletes the excess at once, so the operator must turn this on deliberately.
HEPHAESTUS_WEBHOOK_STREAM_LIMIT_UPDATE_TIMEOUThephaestus.webhook.stream.limit-update-timeout5mwebhook-serverHow long startup waits for one stream limit update. A smaller bound deletes the excess before the broker answers, so a large stream can take long. It is separate from the consumer request timeout, so a slow update does not delay readiness.
HEPHAESTUS_WEBHOOK_STREAM_MAX_AGEhephaestus.webhook.stream.max-age7dwebhook-serverLongest time a webhook stream keeps a message, for each stream without an entry in max-age-by-stream. Must be at least duplicate-window.
HEPHAESTUS_WEBHOOK_STREAM_MAX_BYTEShephaestus.webhook.stream.max-bytes1GBwebhook-serverStorage bound of each webhook stream without an entry in max-bytes-by-stream. At the bound, JetStream deletes the oldest messages to admit new ones. Must be at least 4 times http.max-payload-bytes.
HEPHAESTUS_WEBHOOK_STREAM_MAX_BYTES_GITHUBhephaestus.webhook.stream.max-bytes-by-stream.github10GBwebhook-serverStorage bounds keyed by stream name that override max-bytes for that stream. The github stream carries most of the traffic. Each entry must be at least 4 times http.max-payload-bytes.
HEPHAESTUS_WORKER_DRAIN_TIMEOUThephaestus.worker.drain.timeout5mapplication-workerHow long a stopping worker waits for running practice reviews to finish before it cancels them. Set 0s to cancel them at once.
HEPHAESTUS_WORKER_MENTOR_MAXhephaestus.worker.capacity.mentor-maxautoapplication-workerNumber of conversation turns this worker runs at once. Accepts an integer or auto, which means 8.
HEPHAESTUS_WORKER_REVIEW_MAXhephaestus.worker.capacity.review-maxautoapplication-workerNumber of practice reviews this worker runs at once. Accepts an integer or auto, which means one less than the processor count and at least 1.
HEPHAESTUS_WORKSPACE_SUBDOMAINS_BASE_DOMAINhephaestus.workspace.subdomains.base-domainapplication-server, reverse-proxy, webappDomain under which each workspace gets its subdomain, such as hephaestus.build. Lowercase ASCII without a scheme, port or path, at most 189 characters. Required when subdomains are enabled.
HEPHAESTUS_WORKSPACE_SUBDOMAINS_ENABLEDhephaestus.workspace.subdomains.enabledfalseapplication-server, reverse-proxy, webappGives each workspace its own subdomain address on the base domain. Authentication and the API stay on the apex domain. Prepare DNS, TLS and OAuth callbacks before you turn it on.
HIKARI_MAXIMUM_POOL_SIZEspring.datasource.hikari.maximum-pool-size20; worker: 32application-workerMost PostgreSQL connections that one process holds in its pool. A worker can hold two connections per running review. Keep the sum over all processes below the PostgreSQL connection limit.
IMAGE_TAGspring.application.version
logging.structured.ecs.service.version
application-server, application-worker, webapp, webhook-serverVersion that the application reports in its logs, traces and release card. Compose sets it from the release. Each log record names this version as its service version.
ITEM_EVENT_LEDGER_PENDING_LAPSE_AFTERhephaestus.item-event-ledger.pending-lapse-after7dapplication-server, application-workerAge at which an item event that is still recorded or waiting expires with the reason PENDING_DEADLINE_EXCEEDED. The age counts from when the event occurred.
ITEM_EVENT_LEDGER_PENDING_RETRY_AFTERhephaestus.item-event-ledger.pending-retry-after1happlication-server, application-workerHow long the ledger waits before it offers a recorded or waiting item event for review again.
ITEM_EVENT_LEDGER_SWEEP_BATCH_SIZEhephaestus.item-event-ledger.sweep-batch-size200application-server, application-workerMost item events that each step of the ledger sweep handles. The sweep runs every 15 minutes.
MONITORING_BACKFILL_BATCH_SIZEhephaestus.sync.backfill.batch-size50application-serverMaximum pages to process per repository per cycle.
MONITORING_BACKFILL_ENABLEDhephaestus.sync.backfill.enabledtrueapplication-serverWhether backfill processing is enabled.
MONITORING_BACKFILL_INTERVAL_SECONDShephaestus.sync.backfill.interval-seconds60application-serverSeconds between backfill cycles. A cycle holds its replica lock for at least 30 seconds, so a shorter interval runs at most every 30 seconds.
MONITORING_BACKFILL_RATE_LIMIT_THRESHOLDhephaestus.sync.backfill.rate-limit-threshold500application-serverRemaining API rate limit below which backfill pauses.
MONITORING_RUN_ON_STARTUPhephaestus.sync.run-on-startuptrueapplication-serverWhether to trigger a sync run immediately when the application starts.
MONITORING_SYNC_COOLDOWN_IN_MINUTEShephaestus.sync.cooldown-minutes60application-serverMinimum minutes between consecutive sync operations.
MONITORING_SYNC_CRONhephaestus.sync.cron0 0 * * * *application-serverCron expression for scheduled sync execution.
MONITORING_TIMEFRAMEhephaestus.sync.timeframe-days7application-serverNumber of days to look back when synchronizing pull requests.
NATS_DURABLE_CONSUMER_NAMEhephaestus.sync.nats.durable-consumer-namehephaestusapplication-server, webhook-serverDurable consumer name for JetStream subscriptions (empty for ephemeral).
NATS_ENABLEDhephaestus.sync.nats.enabledtrueapplication-serverWhether NATS JetStream integration is enabled.
NATS_JS_MAX_FILE_BYTEShephaestus.webhook.stream.storage-budget17179869184configs.nats-server.conf, webhook-serverWhat the broker may hold for all webhook streams together. Keep it at or below the free space on the broker volume. The per-stream bounds must stay inside it, so a full stream refuses messages instead of stopping the broker.
NATS_PASSWORDhephaestus.sync.nats.passwordyesapplication-server, nats-server, webhook-serverPassword that the NATS connection authenticates with. Set it together with the user name, or leave both empty.
NATS_USERNAMEhephaestus.sync.nats.usernameyesapplication-server, nats-server, webhook-serverUser name that the NATS connection authenticates with. Set it together with the password, or leave both empty.
OUTLINE_OAUTH_BASE_URLhephaestus.auth.login-providers.outline.base-urlapplication-serverOrigin of the Outline instance for account linking, such as https://wiki.example.com. Required when the client ID is set. It seeds the outline login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
OUTLINE_OAUTH_CLIENT_IDhephaestus.auth.login-providers.outline.client-idapplication-serverClient ID of the Outline OAuth application for linking an Outline account. Set it with its client secret: a provider with only one of the two is not seeded. It seeds the outline login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
OUTLINE_OAUTH_CLIENT_SECREThephaestus.auth.login-providers.outline.client-secretapplication-serverClient secret of the Outline OAuth application for linking an Outline account. Set it with its client ID. It seeds the outline login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
OUTLINE_OAUTH_DISPLAY_NAMEhephaestus.auth.login-providers.outline.display-nameOutlineapplication-serverLabel of the Outline button on the sign-in or account-linking page. It seeds the outline login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
POSTGRES_PASSWORDspring.datasource.passwordyesapplication-server, application-worker, database-migration, postgresLogin password of the database.
PRACTICE_REVIEW_BACKFILL_BATCH_SIZEhephaestus.practice-review.backfill.batch-size25application-server, application-workerHow many items one driver tick offers to the review path. Kept small because the usage ledger only learns a job's cost once it ends, and a budget cap is only checked between batches.
PRACTICE_REVIEW_BACKFILL_COST_HISTORY_WINDOWhephaestus.practice-review.backfill.cost-history-window90dapplication-server, application-workerHow far back the estimator looks for completed reviews to derive a per-review cost from. Long enough to survive a quiet fortnight, short enough that a model change moves it.
PRACTICE_REVIEW_BACKFILL_MAX_ITEMShephaestus.practice-review.backfill.max-items5000application-server, application-workerThe largest number of items that one batch can be confirmed for. A larger batch is refused at preflight.
PRACTICE_REVIEW_BACKFILL_MAX_WINDOWhephaestus.practice-review.backfill.max-window400dapplication-server, application-workerThe longest window a single batch may cover.
PRACTICE_REVIEW_COMPOSITION_TIMEOUThephaestus.practice-review.composition-timeout10mapplication-workerThe longest the worker composes the feedback of one review attempt after its sandbox ends. A destination still open then is withheld as not composed.
PRACTICE_REVIEW_COOLDOWN_MINUTEShephaestus.practice-review.cooldown-minutes15application-server, application-workerMinimum minutes between reviews for the same PR. 0 disables cooldown.
PRACTICE_REVIEW_DELIVER_TO_MERGEDhephaestus.practice-review.deliver-to-mergedfalseapplication-server, application-workerPosts feedback on pull requests that are already merged. Other destinations do not change.
PRACTICE_REVIEW_DIRECT_MODEL_SEARCH_UNITS_PER_ATTEMPThephaestus.practice-review.direct-model-search-units-per-attempt1000application-server, application-workerThe search units that the direct reranking calls of one review attempt may bill, for providers such as Cohere that bill search units. The proxy counts them and refuses further direct calls.
PRACTICE_REVIEW_DIRECT_MODEL_TOKENS_PER_ATTEMPThephaestus.practice-review.direct-model-tokens-per-attempt200000application-server, application-workerThe input and output tokens that the direct model calls of the practice programs of one review attempt may spend together. The calls of the review session itself do not count. The runner holds the programs to it, and the proxy refuses further direct calls.
PRACTICE_REVIEW_MAX_REQUESTS_PER_REQUESTER_PER_HOURhephaestus.practice-review.max-requests-per-requester-per-hour5application-server, application-workerManual review requests per person, workspace and hour. 0 disables the limit.
PRACTICE_REVIEW_PRACTICE_CONCURRENCYhephaestus.practice-review.practice-concurrency3application-server, application-workerMaximum concurrent practice sessions in an item review. Scans remain serial.
PRACTICE_REVIEW_PRACTICE_MODEL_CALLShephaestus.practice-review.practice-model-calls12application-server, application-workerThe model calls that one practice gets in a review turn. A turn gets this number for each practice, and at least the number for three practices.
PRACTICE_REVIEW_PRACTICE_OUTPUT_TOKENShephaestus.practice-review.practice-output-tokens16000application-server, application-workerThe output tokens one practice is owed in a review turn, counted the same way.
PRACTICE_REVIEW_SAMPLING_TEMPERATUREhephaestus.practice-review.sampling-temperatureapplication-server, application-workerRequested model sampling temperature, or null for the provider default.
SANDBOX_API_MAX_REQUEST_BYTEShephaestus.sandbox.gateway.max-request-bytes4194304application-workerLargest request body in bytes that the sandbox gateway accepts. A larger request gets HTTP 413.
SANDBOX_API_PORThephaestus.sandbox.gateway.port8081application-workerPort of the extra worker connector that serves the sandbox gateway. The gateway API answers only on this port. The value 0 binds a free port at start.
SANDBOX_API_REQUESTS_PER_MINUTEhephaestus.sandbox.gateway.requests-per-minute120application-workerMost requests per minute that each sandbox caller can send to the gateway. Further requests get HTTP 429 with a Retry-After header.
SANDBOX_CPUShephaestus.sandbox.default-resource-limits.cpus1.0application-workerCPU limit: a share of CPU time the sandbox may use, not a reservation.
SANDBOX_DOCKER_CERT_PATHhephaestus.sandbox.docker.cert-pathapplication-workerDirectory containing Docker client TLS certificates.
SANDBOX_DOCKER_CONTAINER_RUNTIMEhephaestus.sandbox.docker.container-runtimeapplication-workerDocker runtime name for the sandboxes. Unset uses the default of the daemon. runsc selects gVisor.
SANDBOX_DOCKER_HOSThephaestus.sandbox.docker.hostunix:///var/run/docker.sockapplication-workerEndpoint of the Docker daemon. The single-host deployment uses the local Unix socket.
SANDBOX_DOCKER_OWNERhephaestus.sandbox.docker.ownerdefaultapplication-workerStable installation identifier, shared by roles using the same database.
SANDBOX_DOCKER_TLS_VERIFYhephaestus.sandbox.docker.tls-verifyfalseapplication-workerEnable mutual TLS for TCP connections.
SANDBOX_MAX_CONCURRENThephaestus.sandbox.max-concurrent-containers1application-workerUpper bound on simultaneous sandbox containers.
SANDBOX_MEMORY_BYTEShephaestus.sandbox.default-resource-limits.memory-bytes3221225472application-workerMaximum memory in bytes on Docker, tmpfs pages included. Kubernetes sizes each sandbox Pod by its kind.
SANDBOX_PIDS_LIMIThephaestus.sandbox.default-resource-limits.pids-limit256application-workerMaximum process count.
SPRING_MAIL_HOSTspring.mail.hostapplication-serverSMTP server host. For instance, 'smtp.example.com'.
SPRING_MAIL_PASSWORDspring.mail.passwordapplication-serverLogin password of the SMTP server.
SPRING_MAIL_PORTspring.mail.port587application-serverSMTP server port.
SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTHspring.mail.properties[mail.smtp.auth]trueapplication-serverAdditional JavaMail Session properties.
SPRING_MAIL_PROPERTIES_MAIL_SMTP_SSL_ENABLEspring.mail.properties[mail.smtp.ssl.enable]falseapplication-serverAdditional JavaMail Session properties.
SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLEspring.mail.properties[mail.smtp.starttls.enable]trueapplication-serverAdditional JavaMail Session properties.
SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_REQUIREDspring.mail.properties[mail.smtp.starttls.required]trueapplication-serverAdditional JavaMail Session properties.
SPRING_MAIL_PROTOCOLspring.mail.protocolsmtpapplication-serverProtocol used by the SMTP server.
SPRING_MAIL_USERNAMEspring.mail.usernameapplication-serverLogin user of the SMTP server.
TRACING_OTLP_ENABLEDmanagement.tracing.export.otlp.enabledfalseapplication-server, application-worker, webhook-serverWhether auto-configuration of tracing is enabled to export OTLP traces.
TRACING_OTLP_ENDPOINTmanagement.opentelemetry.tracing.export.otlp.endpointhttp://localhost:4318/v1/tracesapplication-server, application-worker, webhook-serverURL to the OTel collector's HTTP API.
TRACING_SAMPLING_PROBABILITYmanagement.tracing.sampling.probability0.0application-server, application-worker, webhook-serverProbability in the range from 0.0 to 1.0 that a trace will be sampled.
WEBHOOK_ROUTING_PREVIOUS_SECREThephaestus.webhook.routing.previous-secretapplication-server, webhook-serverPrevious routing key that the receiver still accepts during a rotation. Keep it until every hook signed with it is replaced. Requires routing.secret and must differ from it.
WEBHOOK_ROUTING_SECREThephaestus.webhook.routing.secretyesapplication-server, webhook-serverKey that signs the webhook token of each GitLab connection and derives the signing secret of each Outline subscription. At least 32 characters, and must differ from the webhook secret. GitLab and Outline webhook registration is skipped when it is unset.
WEBHOOK_SECREThephaestus.webhook.secretyesapplication-server, webhook-serverShared secret that verifies GitHub webhook signatures and legacy GitLab webhook tokens. GitLab webhook registration needs at least 32 characters. Must differ from both routing secrets.

Compose settings in .env​

Compose itself reads these variables, or passes them to a container that is not a Java runtime role. The second column names the service field that each one feeds. The description comes from .env.example.

VariableFeedsDefaultRequiredServicesDescription
ACME_CHALLENGEcommand
environment.ACME_CHALLENGE
httpchallenge.entrypointreverse-proxyThe ACME challenge that Traefik uses for the certificate. Keep these values for HTTP-01. For DNS-01, set dnschallenge.provider and the name of your lego DNS provider.
ACME_CHALLENGE_VALUEcommand
environment.ACME_CHALLENGE_VALUE
httpreverse-proxyThe ACME challenge that Traefik uses for the certificate. Keep these values for HTTP-01. For DNS-01, set dnschallenge.provider and the name of your lego DNS provider.
ACME_EMAILcommandyesreverse-proxyEmail address for certificate-expiry notices from Let's Encrypt.
APP_HOST_MATCHlabelsHost(`${APP_HOSTNAME}`)application-server, maintenance, webapp, webhook-serverAdditional hostnames this instance answers on, written whole as a Traefik host matcher (Compose cannot build one conditionally). Name APP_HOSTNAME here too — it is not added for you. Unset, APP_HOSTNAME alone is matched. What each name costs and what it gets: docs/admin/install.mdx, "Serving more than one hostname". Example: APP_HOST_MATCH=Host(hephaestus.example.com) || Host(old.example.com).
APP_HOSTNAMEenvironment.APP_HOSTNAME
environment.APPLICATION_CLIENT_URL
environment.APPLICATION_HOST_URL
environment.APPLICATION_SERVER_URL
environment.HEPHAESTUS_AUTH_ISSUER
labels
yesapplication-server, application-worker, maintenance, reverse-proxy, webapp, webhook-serverPublic hostname the instance is served on (DNS A record -> this host). No scheme, no trailing slash. Example: hephaestus.example.com.
APP_MAX_DIRECT_MEMORYenvironment.JAVA_TOOL_OPTIONS128Mapplication-server, application-workerCeiling of the direct (off-heap) buffer memory of the server and worker JVMs. It counts against the memory limit of the container.
APPLICATION_SERVER_CPUScpus4.0application-serverCPU and process limits for the three JVM containers. Keep the worker's process limit: it is the container with Docker access.
APPLICATION_SERVER_MEM_LIMITmem_limit5gapplication-serverContainer memory limits for the three JVMs. Each sizes its heap from its own limit, so lowering a limit lowers the heap with it. Size the host as https://docs.hephaestus.build/admin/sizing describes.
APPLICATION_SERVER_PIDS_LIMITpids_limit512application-serverCPU and process limits for the three JVM containers. Keep the worker's process limit: it is the container with Docker access.
APPLICATION_WORKER_CPUScpus4.0application-workerCPU and process limits for the three JVM containers. Keep the worker's process limit: it is the container with Docker access.
APPLICATION_WORKER_MEM_LIMITmem_limit3gapplication-workerContainer memory limits for the three JVMs. Each sizes its heap from its own limit, so lowering a limit lowers the heap with it. Size the host as https://docs.hephaestus.build/admin/sizing describes.
APPLICATION_WORKER_PIDS_LIMITpids_limit512application-workerCPU and process limits for the three JVM containers. Keep the worker's process limit: it is the container with Docker access.
BACKUP_CIPHER_PASSenvironment.PGBACKREST_REPO1_CIPHER_PASSyespgbackrest, pgbackrest-restore, postgresOptional pgBackRest off-host backup overlay (compose.backup.yaml). Set all values before you enable that overlay. Use a dedicated bucket identity with the least privilege, and a separate encryption passphrase. Never reuse a database or application encryption key for BACKUP_CIPHER_PASS.
BACKUP_RESTORE_S3_KEYenvironment.PGBACKREST_REPO1_S3_KEYyespgbackrest-restore, postgresRead-only bucket identity used only on an isolated restore host. Do not copy the backup writer's key.
BACKUP_RESTORE_S3_KEY_SECRETenvironment.PGBACKREST_REPO1_S3_KEY_SECRETyespgbackrest-restore, postgresRead-only bucket identity used only on an isolated restore host. Do not copy the backup writer's key.
BACKUP_S3_BUCKETenvironment.PGBACKREST_REPO1_S3_BUCKETyespgbackrest, pgbackrest-restore, postgresOptional pgBackRest off-host backup overlay (compose.backup.yaml). Set all values before you enable that overlay. Use a dedicated bucket identity with the least privilege, and a separate encryption passphrase. Never reuse a database or application encryption key for BACKUP_CIPHER_PASS.
BACKUP_S3_ENDPOINTenvironment.PGBACKREST_REPO1_S3_ENDPOINTyespgbackrest, pgbackrest-restore, postgresOptional pgBackRest off-host backup overlay (compose.backup.yaml). Set all values before you enable that overlay. Use a dedicated bucket identity with the least privilege, and a separate encryption passphrase. Never reuse a database or application encryption key for BACKUP_CIPHER_PASS.
BACKUP_S3_KEYenvironment.PGBACKREST_REPO1_S3_KEYyespgbackrest, postgresOptional pgBackRest off-host backup overlay (compose.backup.yaml). Set all values before you enable that overlay. Use a dedicated bucket identity with the least privilege, and a separate encryption passphrase. Never reuse a database or application encryption key for BACKUP_CIPHER_PASS.
BACKUP_S3_KEY_SECRETenvironment.PGBACKREST_REPO1_S3_KEY_SECRETyespgbackrest, postgresOptional pgBackRest off-host backup overlay (compose.backup.yaml). Set all values before you enable that overlay. Use a dedicated bucket identity with the least privilege, and a separate encryption passphrase. Never reuse a database or application encryption key for BACKUP_CIPHER_PASS.
BACKUP_S3_REGIONenvironment.PGBACKREST_REPO1_S3_REGIONyespgbackrest, pgbackrest-restore, postgresOptional pgBackRest off-host backup overlay (compose.backup.yaml). Set all values before you enable that overlay. Use a dedicated bucket identity with the least privilege, and a separate encryption passphrase. Never reuse a database or application encryption key for BACKUP_CIPHER_PASS.
BACKUP_S3_URI_STYLEenvironment.PGBACKREST_REPO1_S3_URI_STYLEpathpgbackrest, pgbackrest-restore, postgresOptional pgBackRest off-host backup overlay (compose.backup.yaml). Set all values before you enable that overlay. Use a dedicated bucket identity with the least privilege, and a separate encryption passphrase. Never reuse a database or application encryption key for BACKUP_CIPHER_PASS.
BPL_JVM_HEAD_ROOMenvironment.BPL_JVM_HEAD_ROOMapplication-workerShare of the worker's container memory limit, in percent, that the buildpack keeps out of the Java memory it calculates. Applies when the JVM starts. Unset keeps the buildpack's default. https://docs.hephaestus.build/admin/sizing#memory-headroom.
DATABASE_MIGRATION_MEM_LIMITmem_limit1gdatabase-migrationThe one-shot database migration, which runs beside the previous roles during an upgrade.
DOCKER_GROUP_IDgroup_add999application-workerSupplementary group that the worker container joins, so that the agent sandbox can reach the Docker socket. The image runs unprivileged and the socket is root:docker 0660. A wrong value fails every sandbox start with "permission denied" at the first review, not at boot. Read the group ID of your host with getent group docker | cut -d: -f3. The value 999 is right on many Debian hosts and wrong on others.
HEPHAESTUS_IMAGE_ALPINEimageyesvolume-initThe digest-pinned image reference of each service. The install and upgrade steps write them into release-lock.env from the verified, signed release lock. Compose refuses to start without them. https://docs.hephaestus.build/admin/release-image-lock.
HEPHAESTUS_IMAGE_NATSimageyesnats-serverThe digest-pinned image reference of each service. The install and upgrade steps write them into release-lock.env from the verified, signed release lock. Compose refuses to start without them. https://docs.hephaestus.build/admin/release-image-lock.
HEPHAESTUS_IMAGE_POSTGRESimageyespgbackrest, pgbackrest-restore, postgresThe digest-pinned image reference of each service. The install and upgrade steps write them into release-lock.env from the verified, signed release lock. Compose refuses to start without them. https://docs.hephaestus.build/admin/release-image-lock.
HEPHAESTUS_IMAGE_TRAEFIKimageyesreverse-proxyThe digest-pinned image reference of each service. The install and upgrade steps write them into release-lock.env from the verified, signed release lock. Compose refuses to start without them. https://docs.hephaestus.build/admin/release-image-lock.
HEPHAESTUS_IMAGE_WEBAPPimageyesmaintenance, webappThe digest-pinned image reference of each service. The install and upgrade steps write them into release-lock.env from the verified, signed release lock. Compose refuses to start without them. https://docs.hephaestus.build/admin/release-image-lock.
LEGO_EXPERIMENTAL_DNS_TCP_ONLYenvironment.LEGO_EXPERIMENTAL_DNS_TCP_ONLYfalsereverse-proxyOptional TCP-only DNS queries when authoritative servers cannot be reached over UDP.
NATS_JS_MAX_MEMcontent4Gconfigs.nats-server.confNATS JetStream limits, sized for a single host. NATS_JS_MAX_MEM caps the memory store of the broker. NATS_JS_MAX_FILE_BYTES is what the broker may hold for all webhook streams together, in bytes. The receiver refuses to start if the per-stream bounds sum above it. Keep it below the free space on the nats-data volume. https://docs.hephaestus.build/admin/webhook-ingestion-operations.
NATS_MAX_PAYLOAD_BYTEScontent26214400configs.nats-server.confLargest single message that the broker carries, in bytes. It must be at least what the webhook receiver accepts, 25 MiB.
POSTGRES_MEM_LIMITmem_limit4gpostgresPostgreSQL sizes shared_buffers and its other memory settings from its own limit.
SECURITY_CONTACTenvironment.SECURITY_CONTACTwebappSecurity contact of this deployment for /.well-known/security.txt: one mailto:, https:// or tel: URI, for example mailto:security@example.com. Empty serves no file.
TANSTACK_DEVTOOLS_ENABLEDenvironment.TANSTACK_DEVTOOLS_ENABLEDfalsewebappTurns on the TanStack developer tools in the webapp. Keep it false in production.
TRAEFIK_DNS_CREDENTIAL_VARIABLEenvironment.TRAEFIK_DNS_CREDENTIAL_VARIABLECF_DNS_API_TOKEN_FILEreverse-proxyProxy-only credentials. Store the raw token in <directory>/token (mode 0600). Keep this directory outside release trees. lego reads it through the _FILE variable.
TRAEFIK_DNS_CREDENTIALS_DIRECTORYvolumes/etc/hephaestus/dnsreverse-proxyProxy-only credentials. Store the raw token in <directory>/token (mode 0600). Keep this directory outside release trees. lego reads it through the _FILE variable.
WEBHOOK_SERVER_CPUScpus2.0webhook-serverCPU and process limits for the three JVM containers. Keep the worker's process limit: it is the container with Docker access.
WEBHOOK_SERVER_MEM_LIMITmem_limit2gwebhook-serverContainer memory limits for the three JVMs. Each sizes its heap from its own limit, so lowering a limit lowers the heap with it. Size the host as https://docs.hephaestus.build/admin/sizing describes.
WEBHOOK_SERVER_PIDS_LIMITpids_limit256webhook-serverCPU and process limits for the three JVM containers. Keep the worker's process limit: it is the container with Docker access.

Application settings that the supported stack fixes​

The application reads these variables, but the supported stack does not take them from .env. Compose sets some of them to a fixed value or from other variables, as the Default column shows. The others keep the application default. In the supported stack, these values are fixed.

VariableSettingDefaultRequiredDescription
AGENT_CLAIM_BATCH_SIZEhephaestus.agent.claim-batch-size5Maximum candidate batch. A blocked endpoint does not consume a local execution slot.
AGENT_MAX_ACTIVE_COMPOSITIONShephaestus.agent.max-active-compositions4Most compositions whose inputs one worker loads at once. Additional attempts wait without loading composition inputs. This does not reduce review sandbox capacity.
AGENT_MAX_RETRIEShephaestus.agent.max-retries5How many times a job whose worker was lost goes back to the queue before it fails. The counter is the attempt number less the attempts that a worker's drain stopped or that found no sandbox room: those spend no retry.
AGENT_PAYLOAD_RETENTIONhephaestus.agent.payload-retentionP14DAge from completed_at at which a TERMINAL job's capture and output are stripped to NULL.
AGENT_POLL_INTERVALhephaestus.agent.poll-interval1sHow long the poll loop sleeps when a poll claimed nothing.
AGENT_ROW_RETENTIONhephaestus.agent.row-retentionP90DAge, counted from the end of a job, at which an ended job row that waits for no delivery is deleted. Must be at least the payload retention.
APP_VERSIONspring.application.version
logging.structured.ecs.service.version
Compose sets ${IMAGE_TAG}Version that the application reports in its logs, traces and release card. Compose sets it from the release. Each log record names this version as its service version.
APPLICATION_HOST_URLhephaestus.host-url
hephaestus.cors.allowed-origins[0]
hephaestus.webapp.url
hephaestus.webhook.external-url
Compose sets https://${APP_HOSTNAME}The public URL of this Hephaestus instance (used for links in notifications). list of origins allowed to make cross-origin requests. Base URL of the webapp for generating links. Public base URL of this instance that GitLab webhooks are registered against. GitLab webhook registration is skipped when it is unset.
DATABASE_PASSWORDspring.datasource.passwordCompose sets ${POSTGRES_PASSWORD}Login password of the database.
DATABASE_URLspring.datasource.urlCompose sets postgresql://postgres:5432/hephaestus?sslmode=disableJDBC URL of the database.
DATABASE_USERNAMEspring.datasource.usernameCompose sets rootLogin username of the database.
DB_PASSWORDspring.datasource.passwordrootLogin password of the database.
DB_USERNAMEspring.datasource.usernamerootLogin username of the database.
GITHUB_OAUTH_CLIENT_IDhephaestus.auth.login-providers.github.client-idCompose sets ${GH_OAUTH_CLIENT_ID}Client ID of the GitHub OAuth App for sign-in. Set it with its client secret: a provider with only one of the two is not seeded. It seeds the github login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GITHUB_OAUTH_CLIENT_SECREThephaestus.auth.login-providers.github.client-secretCompose sets ${GH_OAUTH_CLIENT_SECRET}Client secret of the GitHub OAuth App for sign-in. Set it with its client ID. It seeds the github login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GITHUB_OAUTH_DISPLAY_NAMEhephaestus.auth.login-providers.github.display-nameGitHubLabel of the GitHub button on the sign-in or account-linking page. It seeds the github login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
GITHUB_PAThephaestus.workspace.default.tokenGitHub personal access token for the startup PAT workspace. Required when hephaestus.workspace.init-default turns on the startup workspace.
GITHUB_PAT_LOGINhephaestus.workspace.default.loginhephaestus-buildGitHub organization or user login that the startup PAT workspace syncs. Required when hephaestus.workspace.init-default turns on the startup workspace.
GITLAB_EXTENDED_GRAPHQL_TIMEOUThephaestus.integration.gitlab.extended-graphql-timeout60sTimeout for complex GraphQL operations.
GITLAB_GRAPHQL_TIMEOUThephaestus.integration.gitlab.graphql-timeout30sTimeout for GraphQL operations.
GITLAB_GROUP_PATHhephaestus.workspace.gitlab-default.loginThe GitLab group full path (e.g., my-org/my-team).
GITLAB_PAGINATION_THROTTLEhephaestus.integration.gitlab.pagination-throttle200msDelay between pagination requests, to stay below the rate limits of GitLab.
GITLAB_PAThephaestus.workspace.gitlab-default.tokenThe GitLab Group or Personal Access Token.
GITLAB_SERVER_URLhephaestus.workspace.gitlab-default.server-urlOptional custom server URL for self-hosted GitLab instances.
GITLAB_TOKEN_CACHE_DURATIONhephaestus.integration.gitlab.token-validation-cache-duration5mHow long a token validation result is kept before Hephaestus checks the token against /api/v4/user again.
GITLAB_WORKSPACE_INIT_DEFAULThephaestus.workspace.init-gitlab-defaultfalseCreates a default GitLab workspace with a personal access token at startup.
HEPHAESTUS_AUTH_ACCESS_TTLhephaestus.auth.access-ttl24hAccess-token lifetime, bounded by the absolute session deadline.
HEPHAESTUS_AUTH_AUDIENCEhephaestus.auth.audiencehephaestus-spaExpected aud claim.
HEPHAESTUS_AUTH_COOKIE_NAMEhephaestus.auth.cookie-name__Host-HEPHAESTUS_ATName of the access-token cookie. A name that starts with __Host- requires Secure, Path=/ and no Domain.
HEPHAESTUS_AUTH_DEV_LOGIN_ENABLEDhephaestus.auth.dev-login-enabledfalseTurns on sign-in without a password for local development. The production profile refuses it, and it is unsafe on a deployment that the internet can reach.
HEPHAESTUS_AUTH_ISSUERhephaestus.auth.issuerCompose sets https://${APP_HOSTNAME}Canonical iss claim.
HEPHAESTUS_AUTH_RATE_LIMIT_CLIENT_SESSION_CAPACITYhephaestus.auth.rate-limit.client-session.capacity30Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_AUTH_RATE_LIMIT_CLIENT_SESSION_PERIODhephaestus.auth.rate-limit.client-session.period1mRefill window of the limit. Must be positive.
HEPHAESTUS_AUTH_RATE_LIMIT_DELETE_USER_CAPACITYhephaestus.auth.rate-limit.delete-user.capacity3Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_AUTH_RATE_LIMIT_DELETE_USER_PERIODhephaestus.auth.rate-limit.delete-user.period1hRefill window of the limit. Must be positive.
HEPHAESTUS_AUTH_RATE_LIMIT_ENABLEDhephaestus.auth.rate-limit.enabledtrueTurns on rate limits for sign-in, session and other sensitive endpoints. Turn it off only for load tests.
HEPHAESTUS_AUTH_RATE_LIMIT_EXPORT_CAPACITYhephaestus.auth.rate-limit.export.capacity10Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_AUTH_RATE_LIMIT_EXPORT_PERIODhephaestus.auth.rate-limit.export.period1hRefill window of the limit. Must be positive.
HEPHAESTUS_AUTH_RATE_LIMIT_OAUTH_CAPACITYhephaestus.auth.rate-limit.oauth-authorization.capacity20Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_AUTH_RATE_LIMIT_OAUTH_PERIODhephaestus.auth.rate-limit.oauth-authorization.period1mRefill window of the limit. Must be positive.
HEPHAESTUS_AUTH_RATE_LIMIT_POSTGRES_BACKEDhephaestus.auth.rate-limit.postgres-backedtrueStores rate-limit buckets in PostgreSQL, so all replicas share the limits. When it is false, each replica keeps its own limits in memory. Production must keep it on.
HEPHAESTUS_AUTH_RATE_LIMIT_REFRESH_CAPACITYhephaestus.auth.rate-limit.refresh.capacity60Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_AUTH_RATE_LIMIT_REFRESH_PERIODhephaestus.auth.rate-limit.refresh.period1mRefill window of the limit. Must be positive.
HEPHAESTUS_AUTH_RATE_LIMIT_USER_VIEW_CAPACITYhephaestus.auth.rate-limit.user-view.capacity120Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_AUTH_RATE_LIMIT_USER_VIEW_PERIODhephaestus.auth.rate-limit.user-view.period1mRefill window of the limit. Must be positive.
HEPHAESTUS_AUTH_STEP_UP_MAX_AGEhephaestus.auth.step-up-max-age5mMaximum age of a sign-in for sensitive actions. A token refresh does not reset the sign-in time.
HEPHAESTUS_DATABASE_ALLOW_INSECURE_REMOTEhephaestus.database.allow-insecure-remotefalseLets the prod profile connect to a remote PostgreSQL host without TLS. Without it, startup fails unless the JDBC URL sets sslmode to require, verify-ca or verify-full. Hosts other than localhost, 127.0.0.1, ::1 and postgres count as remote.
HEPHAESTUS_DATABASE_MIGRATION_WAIThephaestus.database.migration-wait10mHow long a role waits at start for the database migration of its release, and how long a migration waits while another migration runs. After it, the process stops and names the reason.
HEPHAESTUS_DEV_SEED_ENABLEDhephaestus.dev.seed-enabledfalseExposes the development endpoint that local seed scripts use to read the practice versions that a review would pin. Use it only in local development, never in production.
HEPHAESTUS_DEV_TRIGGER_ENABLEDhephaestus.dev.trigger-enabledfalseLets requests to paths under /api/dev/ pass the security filter without sign-in. Use it only in local development, never in production.
HEPHAESTUS_FABRIC_ROOThephaestus.fabric.rootCompose sets /data/git-reposLocal directory for the bare Git mirrors and the evidence folders of running reviews. The process must be able to write to it. Its contents are not durable application state.
HEPHAESTUS_INTEGRATION_OUTLINE_CACHE_MAX_SIZE_MBhephaestus.integration.outline.cache.max-size-mb200Cap, for each workspace, on the total size of mirrored document bodies. Above it, the bodies that were materialized longest ago are evicted, and their rows stay.
HEPHAESTUS_INTEGRATION_OUTLINE_STALENESShephaestus.integration.outline.staleness30dHow long a document that was deleted in Outline stays as a tombstone before its row is dropped.
HEPHAESTUS_INTEGRATION_OUTLINE_SYNC_CATCH_UP_DELAYhephaestus.integration.outline.sync.catch-up-delayPT5MPause between the catch-up passes that resume Outline collections still awaiting a complete sync. A pass without pending collections makes no API calls. Accepts an ISO-8601 duration such as PT5M.
HEPHAESTUS_INTEGRATION_OUTLINE_SYNC_CRONhephaestus.integration.outline.sync.cron0 0 */6 * * *Cron expression for the full reconcile of each workspace's Outline document mirror. Uses six fields: second, minute, hour, day of month, month and day of week.
HEPHAESTUS_INTEGRATION_OUTLINE_SYNC_EXPORT_BUDGEThephaestus.integration.outline.sync.export-budget500Most document exports that one pass over a workspace may use. A collection that runs out of budget stays pending, and the next catch-up pass continues it.
HEPHAESTUS_INTEGRATION_SLACK_API_BASEhephaestus.integration.slack.api-basehttps://slack.comBase URL of the Slack API. Override it only to point at a mock server in tests.
HEPHAESTUS_INTEGRATION_SLACK_CONVERSATION_INGEST_ENABLEDhephaestus.integration.slack.conversation-ingest.enabledtrueLets workspaces ingest Slack channel messages for conversation reviews. Nothing is read until a workspace admin activates a channel. Set it to false to turn off channel ingestion for the whole instance.
HEPHAESTUS_LLM_CALL_POOLS_MAX_COOLDOWNhephaestus.llm.call-pools.max-cooldownPT5MLongest shared provider pause accepted from an instance-funded HTTP 429 response.
HEPHAESTUS_LLM_CALL_POOLS_PERMIT_LEASEhephaestus.llm.call-pools.permit-leasePT1MPermit renewal window. A live worker cancels calls after three quarters of this window without renewal. Admission and administration reclaim expired grants. Only unused reservations are refunded.
HEPHAESTUS_MENTOR_TURN_CAPACITYhephaestus.mentor.turn.capacityThe conversation turns that all workers together run at once: the number of workers times the conversation turns of each. While every one of them runs a turn, a question that could start next says that Hephaestus is answering other questions. Unset, no question says why it waits. The Helm chart sets it. Must be at least 1 when set.
HEPHAESTUS_RATE_LIMIT_MENTOR_TURNS_CAPACITYhephaestus.auth.rate-limit.mentor-turns.capacity20Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_RATE_LIMIT_MENTOR_TURNS_PERIODhephaestus.auth.rate-limit.mentor-turns.period10mRefill window of the limit. Must be positive.
HEPHAESTUS_RATE_LIMIT_REVIEW_REQUEST_CAPACITYhephaestus.auth.rate-limit.review-request.capacity10Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_RATE_LIMIT_REVIEW_REQUEST_PERIODhephaestus.auth.rate-limit.review-request.period1hRefill window of the limit. Must be positive.
HEPHAESTUS_RATE_LIMIT_SYNC_TRIGGER_CAPACITYhephaestus.auth.rate-limit.sync-trigger.capacity10Most requests that one key may send within one period. Must be at least 1.
HEPHAESTUS_RATE_LIMIT_SYNC_TRIGGER_PERIODhephaestus.auth.rate-limit.sync-trigger.period1hRefill window of the limit. Must be positive.
HEPHAESTUS_RUNTIME_SERVER_ENABLEDhephaestus.runtime.server.enabledCompose sets falseRuns the server role, which serves the API, syncs provider work and delivers feedback. Turn it off in a worker-only or webhook-only container.
HEPHAESTUS_RUNTIME_WEBHOOK_ENABLEDhephaestus.runtime.webhook.enabledCompose sets true; falseRuns the webhook role, which receives provider webhooks and publishes them to NATS JetStream. Under the prod profile, this role needs NATS.
HEPHAESTUS_RUNTIME_WORKER_ENABLEDhephaestus.runtime.worker.enabledCompose sets falseRuns the worker role, which runs sandboxed practice reviews and conversation turns. Only a container with this role may mount the Docker socket.
HEPHAESTUS_SANDBOX_KUBERNETES_NAMESPACEhephaestus.sandbox.kubernetes.namespaceThe namespace of every sandbox Pod and Job. The installation owns it alone, so everything in it of the sandbox kinds is this installation's.
HEPHAESTUS_SANDBOX_KUBERNETES_NODE_SELECTORhephaestus.sandbox.kubernetes.node-selectorThe node labels of sandbox Pods, as a JSON object. Empty allows any node.
HEPHAESTUS_SANDBOX_KUBERNETES_POD_IPhephaestus.sandbox.kubernetes.pod-ipThe address of this worker's own Pod: its sandboxes reach its gateway there.
HEPHAESTUS_SANDBOX_KUBERNETES_POD_NAMEhephaestus.sandbox.kubernetes.pod-nameThis worker's own Pod.
HEPHAESTUS_SANDBOX_KUBERNETES_PROBE_INTERVALhephaestus.sandbox.kubernetes.probe-interval15mHow often the isolation probe runs again after the worker's start.
HEPHAESTUS_SANDBOX_KUBERNETES_RUNTIME_CLASS_NAMEhephaestus.sandbox.kubernetes.runtime-class-nameThe RuntimeClass of every sandbox Pod, gVisor's for example. Blank selects the cluster's default. A named class that the cluster does not have fails the isolation probe.
HEPHAESTUS_SANDBOX_KUBERNETES_SECCOMP_PROFILEhephaestus.sandbox.kubernetes.seccomp-profileThe shipped sandbox/agent-seccomp-profile.json as a Localhost profile, relative to the kubelet's seccomp directory. Blank selects RuntimeDefault.
HEPHAESTUS_SANDBOX_KUBERNETES_TOLERATIONShephaestus.sandbox.kubernetes.tolerationsThe tolerations of sandbox Pods, as a JSON array of Kubernetes tolerations. Empty tolerates no taint.
HEPHAESTUS_SANDBOX_RUNTIMEhephaestus.sandbox.runtimedockerWhere a worker runs its sandboxes: docker or kubernetes. A worker runs one runtime and never falls back to the other.
HEPHAESTUS_SYNC_BACKFILL_PR_PAGE_SIZEhephaestus.integration.github.sync.backfill-pr-page-size10Page size of pull request backfill queries. It is smaller than in regular sync, because backfill responses include reviews, threads and comments.
HEPHAESTUS_SYNC_BACKFILL_TIMEOUThephaestus.integration.github.sync.backfill-graphql-timeout120sTimeout for backfill operations, which fetch pull requests with their reviews, threads and comments. Large repositories need a longer timeout than regular sync.
HEPHAESTUS_SYNC_DISCUSSIONS_ENABLEDhephaestus.sync.discussions.enabledfalseWhether discussion sync runs.
HEPHAESTUS_SYNC_EXTENDED_GRAPHQL_TIMEOUThephaestus.integration.github.sync.extended-graphql-timeout120sExtended timeout for complex GraphQL operations, such as review comments. Accepts duration format: 60s, 1m, PT60S.
HEPHAESTUS_SYNC_GRAPHQL_TIMEOUThephaestus.integration.github.sync.graphql-timeout60sTimeout for standard GraphQL operations. Accepts duration format: 30s, 1m, PT30S.
HEPHAESTUS_SYNC_INCREMENTAL_BUFFERhephaestus.integration.github.sync.incremental-sync-buffer5mTime subtracted from the last sync time, so that items updated shortly before it are still fetched despite clock differences with GitHub.
HEPHAESTUS_SYNC_INCREMENTAL_ENABLEDhephaestus.integration.github.sync.incremental-sync-enabledtrueWhether to use incremental sync based on last sync timestamp.
HEPHAESTUS_SYNC_PAGINATION_THROTTLEhephaestus.integration.github.sync.pagination-throttle200msDelay between pagination requests that keeps the load on the GitHub API low. Accepts duration format: 200ms, PT0.2S.
HEPHAESTUS_SYNC_PROJECTS_ENABLEDhephaestus.sync.projects.enabledfalseWhether project sync runs.
HEPHAESTUS_TENANCY_ENFORCEMENThephaestus.tenancy.enforcementthrowHow the SQL inspector reacts to a query on a workspace-scoped table that has no workspace guard. The value throw fails the query, log logs a warning and counts it, and off turns inspection off. Use log or off only for diagnostics.
HEPHAESTUS_WEBAPP_URLhephaestus.webapp.url${APPLICATION_HOST_URL}Base URL of the webapp for generating links.
HEPHAESTUS_WEBHOOK_STREAM_STORAGE_BUDGEThephaestus.webhook.stream.storage-budgetCompose sets ${NATS_JS_MAX_FILE_BYTES}What the broker may hold for all webhook streams together. Keep it at or below the free space on the broker volume. The per-stream bounds must stay inside it, so a full stream refuses messages instead of stopping the broker.
HOSTNAMElogging.structured.ecs.service.node-nameStructured ECS service node name.
MANAGEMENT_PORTmanagement.server.port9090Management endpoint HTTP port (uses the same port as the application by default). Configure a different port to use management-specific SSL.
NATS_SERVERhephaestus.sync.nats.serverCompose sets nats://nats-server:4222NATS server URL (e.g., nats://localhost:4222).
POSTGRES_PORTspring.datasource.url5432JDBC URL of the database.
SANDBOX_RECONCILIATION_INTERVALhephaestus.sandbox.reconciliation-interval-seconds60Interval between orphan cleanup sweeps.
SANDBOX_STOP_TIMEOUThephaestus.sandbox.container-stop-timeout-seconds10SIGTERM → SIGKILL grace period.
SERVER_PORTserver.port
hephaestus.auth.issuer
8080Server HTTP port. canonical iss claim.
SHUTDOWN_TIMEOUTspring.lifecycle.timeout-per-shutdown-phase
spring.task.scheduling.shutdown.await-termination-period
20sTimeout for the shutdown of any phase (group of SmartLifecycle beans with the same 'phase' value). Maximum time the executor should wait for remaining tasks to complete.
SLACK_OAUTH_CLIENT_IDhephaestus.auth.login-providers.slack.client-id${HEPHAESTUS_INTEGRATION_SLACK_CLIENT_ID}Client ID of the Slack app for linking a Slack account. It falls back to the Slack workspace-install credentials. Set it with its client secret: a provider with only one of the two is not seeded. It seeds the slack login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
SLACK_OAUTH_CLIENT_SECREThephaestus.auth.login-providers.slack.client-secret${HEPHAESTUS_INTEGRATION_SLACK_CLIENT_SECRET}Client secret of the Slack app for linking a Slack account. It falls back to the Slack workspace-install credentials. Set it with its client ID. It seeds the slack login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
SLACK_OAUTH_DISPLAY_NAMEhephaestus.auth.login-providers.slack.display-nameSlackLabel of the Slack button on the sign-in or account-linking page. It seeds the slack login provider at startup only when that provider does not exist yet. Later changes go through Instance admin, Login providers.
SPRINGDOC_API_DOCS_ENABLEDspringdoc.api-docs.enabledfalseWhether to generate and serve an OpenAPI document.
SPRINGDOC_SWAGGER_UI_ENABLEDspringdoc.swagger-ui.enabledfalseWhether to generate and serve an OpenAPI document.
WEBAPP_PORThephaestus.auth.passkeys.allowed-origins4200Browser origins that may register and use passkeys, as a comma-separated list. Each must be an HTTPS origin on the RP ID or one of its subdomains. When it is empty, the origin of the auth issuer is used.
WEBHOOK_EXTERNAL_URLhephaestus.webhook.external-url${APPLICATION_HOST_URL}Public base URL of this instance that GitLab webhooks are registered against. GitLab webhook registration is skipped when it is unset.
WEBHOOK_TOKEN_ROTATION_THRESHOLD_DAYShephaestus.webhook.token-rotation.threshold-days7Days before a GitLab connection token expires at which Hephaestus rotates it. Set 0 to only report the expiring token without rotating it.
WEBHOOK_TOKEN_ROTATION_VALIDITY_DAYShephaestus.webhook.token-rotation.validity-days90Lifetime in days of the new token that a GitLab token rotation requests. Must be at least 1.