# Evanescere configuration file. # # Copy this file to config.toml for local Compose runs: # # cp config.example.toml config.toml # # In containers, mount your config to: # # /etc/evanescere/config.toml # # Secrets such as DeepSeek and WebDAV credentials belong in your private config.toml. [app] # Free-form environment label included in logs. env = "dev" # Python logging level: DEBUG, INFO, WARNING, ERROR. log_level = "DEBUG" # Enable SQLAlchemy SQL logging. Very noisy; keep false unless debugging DB behavior. log_sql = false # Frontend origins allowed to call FastAPI. Include the Vite dev server while developing. cors_origins = ["http://localhost:3000", "http://localhost:5173"] [database] # PostgreSQL connection string used by SQLAlchemy. # For Compose local-db profile: postgresql+psycopg://evanescere:evanescere@postgres:5432/evanescere # For an existing DB: postgresql+psycopg://USER:PASSWORD@HOST:5432/DBNAME url = "postgresql+psycopg://evanescere:evanescere@postgres:5432/evanescere" [redis] # Redis URL used by Dramatiq workers. url = "redis://redis:6379/0" [storage] # Container path for working media. Mount a Framework SSD directory here in Compose. local_root = "/data/evanescere" [webdav] # IIS WebDAV directory containing recording files. Point at the collection, not one file. base_url = "https://windows-server.example.local/webdav/recordings" # Leave username/password empty if your WebDAV endpoint does not require basic auth. username = "" password = "" # Set false only for trusted internal/self-signed testing. verify_tls = true # Scheduler interval. A file becomes stable after two equal positive size samples. poll_interval_seconds = 60 [funasr] # FunASR-compatible API base URL. Evanescere calls /audio/transcriptions. base_url = "http://funasr:10096/v1" # Optional bearer token for the FunASR service. api_key = "" # Model name sent to FunASR. Adjust this to match your deployed service. model = "paraformer-zh" [deepseek] # OpenAI-compatible DeepSeek API base URL. base_url = "https://api.deepseek.com" # Required when clip suggestion is enabled. api_key = "" # Initial MVP model. model = "deepseek-v4-pro" # Lower values improve consistency. temperature = 0.2 [defaults] # Initial automatic pipeline settings. These can later be changed through the API/UI. suggest_enabled = true render_enabled = true # For testing, consider false until uploads are wired and verified. upload_enabled = true preserve_final_artifacts = true bake_subtitles = true [clip] # LLM clip duration bounds accepted by the backend. min_seconds = 30 max_seconds = 360 # Transcript seconds per DeepSeek request. Larger chunks use more tokens. transcript_chunk_seconds = 900 [thumbnail] # Generate thumbnails during clip render. enabled = true # frame_overlay: use extracted video frame as background. # command: run command below to call a local image generation workflow. provider = "frame_overlay" width = 1920 height = 1080 # Optional transparent PNG of the VTuber character. character_overlay_path = "" # Character height as a fraction of thumbnail height. character_scale = 0.42 # Supported: bottom-right, bottom-left, center-right, center-left. character_position = "bottom-right" # Draw the clip title onto the final thumbnail. title_enabled = true # Used only when provider = "command". Receives JSON on stdin and must write output_path. command = "" [upload] # noop: do not upload, only record what would have happened. # command: run command below with JSON metadata on stdin. adapter = "noop" command = ""