Files
petal/internal/config/config.go
prosolis 6e6e4edce7 Editor: font-size presets + image insert/export support
Two editor features that were in flight alongside the sound work:
- FontSize TipTap extension (rides on textStyle) with Small/Normal/Large/
  Title presets in the toolbar; StatusBar + CSS support
- Image handling: internal/images handler, upload route + config, client
  API, EditorCore wiring, and md/html/docx export support for images

Claude-Session: https://claude.ai/code/session_016Yr6jELuRc7hyzYLccQKZd
2026-06-26 09:05:40 -07:00

66 lines
1.8 KiB
Go

package config
import (
"os"
"time"
)
// Config holds all runtime configuration, loaded from environment variables.
// See .env.example for the full list and defaults.
type Config struct {
Port string
BaseURL string
DatabasePath string
ImageDir string // on-disk store for editor image uploads
// LLM
LLMBackend string // "vllm" | "ollama"
LLMEndpoint string
LLMModel string // checkpoint model (small, fast)
LLMChatModel string // Ask Petal model; falls back to LLMModel if empty
LLMTimeout time.Duration
// Auth (deferred — not wired in the local-dev build, kept for later)
AuthentikURL string
AuthentikClientID string
AuthentikClientSecret string
SessionSecret string
}
// Load reads configuration from the environment, applying sane local-dev defaults.
func Load() *Config {
return &Config{
Port: env("PORT", "8080"),
BaseURL: env("BASE_URL", "http://localhost:8080"),
DatabasePath: env("DATABASE_PATH", "./data/petal.db"),
ImageDir: env("IMAGE_DIR", "./data/images"),
LLMBackend: env("LLM_BACKEND", "vllm"),
LLMEndpoint: env("LLM_ENDPOINT", "http://localhost:8000"),
LLMModel: env("LLM_MODEL", ""),
LLMChatModel: env("LLM_CHAT_MODEL", ""),
LLMTimeout: envDuration("LLM_TIMEOUT", 30*time.Second),
AuthentikURL: env("AUTHENTIK_URL", ""),
AuthentikClientID: env("AUTHENTIK_CLIENT_ID", ""),
AuthentikClientSecret: env("AUTHENTIK_CLIENT_SECRET", ""),
SessionSecret: env("SESSION_SECRET", "dev-insecure-secret-change-me"),
}
}
func env(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func envDuration(key string, fallback time.Duration) time.Duration {
if v := os.Getenv(key); v != "" {
if d, err := time.ParseDuration(v); err == nil {
return d
}
}
return fallback
}