Skip to main content

Configuration reference

Every Scryon configuration knob is an environment variable. They all have safe defaults so a vanilla ./mvnw spring-boot:run works on a developer laptop. Production deployments override what they need.

The source of truth is src/main/resources/application.yml in scryon-backend.

Core

VariableDefaultNotes
SERVER_PORT8080HTTP listener port.
DB_URLjdbc:postgresql://localhost:5432/scryonJDBC URL.
DB_USERNAMEscryonDB user.
DB_PASSWORDscryonDB password.
FLYWAY_ENABLEDtrueSet to false only for the H2 test profile.
MAX_FILE_SIZE50MBHard cap per uploaded recording.
MAX_REQUEST_SIZE55MBMAX_FILE_SIZE + room for the metadata envelope.

Security

VariableDefaultNotes
SCRYON_API_KEY(empty)Optional shared-secret header. If unset the guard is off — local dev only.
FIREBASE_PROJECT_ID(empty)When set, every /api/** request needs a valid Firebase ID token.
FIREBASE_CLIENT_EMAIL(empty)Service-account client email — enables Admin SDK verification.
FIREBASE_PRIVATE_KEY(empty)PEM-encoded service-account private key.
SCRYON_CORS_ALLOWED_ORIGINS(empty)Comma-separated allowlist. Empty = no CORS headers.

Observability

VariableDefaultNotes
SCRYON_OBSERVABILITY_ENABLEDtrueMaster switch.
SCRYON_REQUEST_LOGGING_ENABLEDtrueStructured HTTP access log.
SCRYON_PIPELINE_LOGGING_ENABLEDtruePer-stage event=PIPELINE log lines.
SCRYON_DEBUG_ENDPOINTS_ENABLEDfalseOwner-scoped /api/debug/calls/{id}/events.
SCRYON_TRACING_ENABLEDfalseMicrometer Observation spans.
MANAGEMENT_TRACING_ENABLEDfalseSpring Boot tracing facade.
OTEL_EXPORTER_OTLP_ENDPOINT(empty)OTLP collector URL.
OTEL_TRACES_SAMPLER_ARG0.1Trace sampling probability.
SENTRY_DSN(empty)Sentry project DSN. Empty = no events sent.
SENTRY_ENVIRONMENTlocalTags Sentry events.
SENTRY_TRACES_SAMPLE_RATE0.1Sentry performance sampling.
MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDEhealth,info,metrics,prometheusActuator exposure list.

Privacy

VariableDefaultNotes
REDACT_TRANSCRIPTStrueRedact transcript text from INFO logs.

The hard rule "Scryon never persists raw audio" is enforced in code, not config. There is no env var to disable it.

Transcription (Lemonfox)

VariableDefaultNotes
LEMONFOX_API_KEY(empty)Required.
LEMONFOX_BASE_URLhttps://api.lemonfox.ai/v1Override for self-hosted.
LEMONFOX_MODELwhisper-1Whisper variant.
LEMONFOX_LANGUAGE(auto)ISO-639-1 hint. Empty = autodetect.
LEMONFOX_TIMEOUT_SECONDS180Per-request timeout.
SCRYON_TRANSCRIPTION_CALLBACK_ENABLEDfalseAsync webhook mode.
SCRYON_PUBLIC_BASE_URL(empty)Required when callback mode is on.
SCRYON_WEBHOOK_SECRET(empty)≥ 32-byte HMAC secret for webhook URL signing.
SCRYON_TRANSCRIPTION_CALLBACK_TIMEOUT_MINUTES30Sweep stuck callbacks after this.

Diarization (pyannoteAI)

VariableDefaultNotes
PYANNOTE_ENABLEDfalseMaster switch. Fallback to Lemonfox built-in diarization when off.
PYANNOTE_API_KEY(empty)Required when enabled.
PYANNOTE_BASE_URLhttps://api.pyannote.ai
PYANNOTE_MODELprecision-2
SCRYON_DIARIZATION_TIMEOUT_SECONDS300Polling deadline.
SCRYON_DIARIZATION_POLL_INTERVAL_SECONDS5Job poll cadence.
SCRYON_DIARIZATION_MAX_RETRIES2Network + 5xx retries.
SCRYON_DIARIZATION_MAX_AUDIO_MINUTES30Skip pyannote above this (cost/latency guard).
SCRYON_DIARIZATION_HINT_TWO_SPEAKERStrueSend numSpeakers: 2 for phone calls.

Voice embedding (opt-in)

VariableDefaultNotes
SCRYON_VOICE_EMBEDDING_ENABLEDfalseMaster switch. APIs 404 when off.
SCRYON_VOICE_EMBEDDING_PROVIDERpyannoteReuses pyannote credentials.
SCRYON_VOICE_EMBEDDING_HIGH_THRESHOLD0.85Score ≥ ⇒ HIGH match.
SCRYON_VOICE_EMBEDDING_MEDIUM_THRESHOLD0.75Score ≥ ⇒ MEDIUM match.
SCRYON_VOICE_SAMPLE_MIN_SECONDS15Reject samples below.
SCRYON_VOICE_SAMPLE_MAX_SECONDS45Reject samples above.
SCRYON_VOICE_SAMPLE_MAX_SIZE_MB10Hard file-size cap.
SCRYON_VOICE_CONSENT_VERSIONv1Bump to require re-consent.

Audio preprocessing

VariableDefaultNotes
SCRYON_AUDIO_PREPROCESSING_ENABLEDtrueMono + 16 kHz + loudnorm pipeline.
SCRYON_FFMPEG_PATHffmpegOverride for non-PATH installs.
SCRYON_AUDIO_PREPROCESSING_OUTPUT_FORMATwavOutput container.
SCRYON_AUDIO_PREPROCESSING_TIMEOUT_SECONDS60Per-file ffmpeg timeout.
SCRYON_AUDIO_DENOISE_ENABLEDtrueHigh-pass + FFT denoise before loudnorm.
SCRYON_AUDIO_HIGHPASS_HZ80HVAC rumble cutoff.
SCRYON_AUDIO_DENOISE_NR_DB12Noise reduction strength (dB).
SCRYON_AUDIO_DENOISE_NOISE_FLOOR_DB-25Estimated noise floor.

LLM (analysis)

VariableDefaultNotes
LLM_PROVIDERopenai
LLM_API_KEY(empty)Required.
LLM_BASE_URLhttps://api.openai.com/v1
LLM_MODELgpt-4o-mini
LLM_TIMEOUT_SECONDS120
LLM_TEMPERATURE0.2

Object storage

VariableDefaultNotes
OBJECT_STORAGE_PROVIDERlocallocal or s3.
OBJECT_STORAGE_BUCKET(empty)S3 bucket name.
OBJECT_STORAGE_ENDPOINT(empty)S3-compatible endpoint URL.
OBJECT_STORAGE_REGIONauto
OBJECT_STORAGE_ACCESS_KEY(empty)
OBJECT_STORAGE_SECRET_KEY(empty)
OBJECT_STORAGE_PATH_STYLE_ACCESStrueDisable for path-aware AWS S3.
OBJECT_STORAGE_LOCAL_PATH./var/storageUsed only when provider = local.
OBJECT_STORAGE_TEMP_AUDIO_TTL_HOURS24How long temp audio survives before sweep.

Async / background jobs

VariableDefaultNotes
SCRYON_STALE_JOB_TIMEOUT_MINUTES15Mark jobs FAILED after this.
SCRYON_SWEEP_INTERVAL_MS300000Sweeper period.
SCRYON_SWEEP_INITIAL_DELAY_MS60000Startup delay.