Skip to content

    Development documentation — this describes the current development branch. Documented behavior may not exist in the latest release.

    Environment variables

    Every setting is a plain (unprefixed) environment variable read once at startup. The .env.example file at the repository root carries the same list with inline comments.

    VariableDefaultPurpose
    HOST0.0.0.0Bind address (used by the python -m server entrypoint)
    PORT8000Bind port (used by the python -m server entrypoint)
    DATA_DIR/dataWritable state dir: TLS cert/key (<DATA_DIR>/tls) and the persisted active model (<DATA_DIR>/active_model)
    UVICORN_ROOT_PATH(unset)Path prefix when served behind a reverse proxy (e.g. /whisper)

    The Helm chart launches uvicorn ... --host 0.0.0.0 --port 8000 directly, so HOST/PORT apply to container runs via the default entrypoint, not to the chart.

    VariableDefaultPurpose
    MODEL_SIZElarge-v3 (x86 image); small (Jetson image)Whisper size alias or a CTranslate2 repo id to load
    DEVICEcudacuda, cpu, or auto (trimmed and lowercased)
    COMPUTE_TYPEdevice-dependentExplicit value wins; otherwise float16 on cuda, int8 on cpu, default on anything else
    BEAM_SIZE5Beam-search width
    DEFAULT_LANGUAGE(auto)Fallback source language when a request omits language; empty means auto-detect
    ENABLE_VAD_FILTERtrueSkip non-speech with voice-activity detection
    MODEL_DIR/app/modelsBaked-model dir (<MODEL_DIR>/<MODEL_SIZE>); empty string forces the Hugging Face download path
    MODEL_REVISION(unset)Hugging Face git revision override for hub downloads; bypasses the built-in pin table

    COMPUTE_TYPE is not a fixed default. CTranslate2 cannot run float16 on CPU, so the server chooses int8 when DEVICE=cpu. Setting COMPUTE_TYPE explicitly always wins, verbatim.

    VariableDefaultPurpose
    WARMUP_ON_STARTtrueEagerly load and warm the model in a background task at boot; false loads lazily on the first request
    MAX_CONCURRENCY1Active transcriptions at once (feeds the /system activity meter)
    QUEUE_SIZE32Maximum requests allowed to wait for a slot before shedding with 503 queue_full
    QUEUE_TIMEOUT_S120Seconds a queued request waits for a slot before 503 queue_timeout
    VariableDefaultPurpose
    API_KEY(unset)When set, protected routes require Authorization: Bearer <key>; unset leaves the API open
    MAX_UPLOAD_BYTES26214400Reject uploads larger than this (25 MB); 0 disables the cap
    VariableDefaultPurpose
    LOG_INPUT_TEXTfalseLog transcript text — keep off; transcripts are sensitive PII. Off logs only lengths and timings
    PERSIST_AUDIOfalseReserved / not enforced. No code path persists audio; uploads always use a per-request temp file that is deleted afterward
    RETENTION_DAYS0Reserved / not enforced. Placeholder for future stored-artifact retention

    PERSIST_AUDIO and RETENTION_DAYS are declared but currently have no runtime effect — see Privacy and responsible use.

    VariableDefaultPurpose
    ENABLE_WEB_UItrueServe the web console at /web
    WEBUI_DIST_DIR/app/webui_distDirectory of the built console assets (populated by the image build)
    VariableDefaultPurpose
    TLS_ENABLEDfalseServe HTTPS directly via uvicorn SSL (honored by the python -m server entrypoint)
    TLS_SELF_SIGNEDtrueAuto-generate a self-signed cert on first run if none is supplied
    TLS_CERT_FILE<DATA_DIR>/tls/cert.pemCertificate path; set to supply your own
    TLS_KEY_FILE<DATA_DIR>/tls/key.pemPrivate key path; set to supply your own
    TLS_CNlocalhostCommon name of the generated cert
    TLS_SAN(none)Extra Subject Alternative Names, comma-separated

    See Security hardening for how the generated certificate is produced and when to replace it.