# Petal — copy to .env and fill in. All values have local-dev defaults; override as needed. # Server PORT=8080 BASE_URL=http://localhost:8080 # Database (SQLite, pure-Go modernc — no cgo) DATABASE_PATH=./data/petal.db # On-disk store for images pasted/dropped/inserted in the editor IMAGE_DIR=./data/images # LLM LLM_BACKEND=vllm # vllm | ollama LLM_ENDPOINT=http://localhost:8000 # vLLM :8000, Ollama :11434 LLM_MODEL= # checkpoint model (small/fast). Never hardcoded. LLM_CHAT_MODEL= # Ask Petal model (Mandarin-native). Falls back to LLM_MODEL if empty. LLM_TIMEOUT=30s # Read-aloud (TTS). Off unless TTS_ENDPOINT is set — when empty, the /api/tts route # is not mounted and the frontend falls back to the browser's Web Speech API. # Backed by a local Piper HTTP server (python3 -m piper.http_server). # Each Piper HTTP server loads ONE voice, so English and Chinese need separate # instances (different ports). zh is only routed when both TTS_ENDPOINT_ZH and # TTS_VOICE_ZH are set; otherwise Chinese falls back to Web Speech. TTS_ENDPOINT= # e.g. http://127.0.0.1:5005 — empty disables server TTS TTS_ENDPOINT_ZH= # e.g. http://127.0.0.1:5006 — Chinese Piper instance TTS_VOICE_EN=en_US-amy-medium # Piper voice id for English TTS_VOICE_ZH=zh_CN-huayan-medium # Piper voice id for Chinese TTS_CACHE_DIR=./data/tts # on-disk store for synthesized clips (content-addressed) TTS_TIMEOUT=15s TTS_AUDIO_FORMAT=mp3 # mp3 | opus | wav — mp3/opus transcode Piper's WAV via ffmpeg # --- Deferred (not wired in the local-dev build) --- # Auth (Authentik OIDC) — deferred; single hardcoded local user for now # SESSION_SECRET=change-me-to-random-64-char-string # AUTHENTIK_URL=https://auth.parodia.dev # AUTHENTIK_CLIENT_ID=petal # AUTHENTIK_CLIENT_SECRET= # Copyleaks (Tier-2 plagiarism) — deferred; needs a public webhook # COPYLEAKS_ENABLED=false # COPYLEAKS_API_KEY= # COPYLEAKS_EMAIL=