# Topic Watch Configuration # Copy this file to data/config.yml and fill in your values. # All settings can be overridden via environment variables with the prefix TOPIC_WATCH_ # Example: TOPIC_WATCH_LLM__API_KEY=sk-abc123 # LLM provider settings (required) llm: # Model string in LiteLLM format: provider/model-name # Examples: openai/gpt-5.4-nano, anthropic/claude-haiku-4-5, ollama/llama3.3 model: "openai/gpt-5.4-nano" # API key for your LLM provider api_key: "your-api-key-here" # Optional: Base URL for a self-hosted (Ollama) or OpenAI-compatible gateway endpoint. # Honored for any provider; leave unset to use the provider's default endpoint. # A local or LAN endpoint may use plain http, as the Ollama examples below do; # a public one must use https, since the request carries your API key. # # Ollama (self-hosted). In Docker use host.docker.internal instead of localhost: # base_url: "http://host.docker.internal:11434" # or http://localhost:11434 outside Docker # # OpenAI-compatible gateway (e.g. OpenCode Go, a LiteLLM proxy) — use the openai/ prefix: # model: "openai/" # base_url: "https://opencode.ai/zen/go/v1" # Exa AI search source (optional). A paid semantic web-search API (https://exa.ai) # that a topic can use instead of RSS by selecting the "Exa AI search" source mode. # Bring your own key; also settable via TOPIC_WATCH_EXA__API_KEY. # NOTE: each check runs one paid Exa search — mind your per-topic check interval. exa: enabled: false api_key: "" # Optional advanced/proxy override; defaults to https://api.exa.ai when unset. # Must be https: the request carries your Exa API key, so a plain-http # endpoint is refused rather than sent in cleartext. # base_url: "https://api.exa.ai" # Notification settings # Uses Apprise URL format. See: https://github.com/caronc/apprise/wiki # No notifications are sent until you add at least one URL (here or on the # Settings page). Uncomment an example below and replace the placeholder with # your own — placeholder values are ignored, so leaving one as-is sends nothing. notifications: urls: [] # - "ntfy://your-topic-name" # - "discord://webhook_id/webhook_token" # - "tgram://bot_token/chat_id" # - "slack://token_a/token_b/token_c/channel" # Custom webhook URLs for JSON POST notifications # Each URL receives a POST with JSON body: # {"topic": "name", "reasoning": "...", "summary": "...", "key_facts": [...], "source_urls": [...], "confidence": 0.85, "relevance": 0.88, "importance": 3, "timestamp": "..."} webhook_urls: [] # - "https://your-server.com/webhook/topic-watch" # - "https://hooks.example.com/trigger" # Default check interval (how often to check each topic for updates) # Supported units: m (minutes), h (hours), d (days), w (weeks), M (months) # Combine units: "1w 3d", "2h 30m" — min 10m, max 6M check_interval: "6h" # Maximum number of articles to process per check per topic # Higher values use more LLM tokens but catch more updates max_articles_per_check: 10 # Maximum token budget for the knowledge state summary # The LLM will compress older facts when approaching this limit. # Note: this is a prompt-level budget. LLM output is separately hard-capped # internally (8192 tokens, or the model's own max output if lower) to stay below # providers' non-streaming limits, so raising this above ~8000 has no effect. knowledge_state_max_tokens: 2000 # How many knowledge revisions to keep per topic for the diff timeline on the # topic detail page. Each revision stores a full copy of the knowledge summary # — roughly 8 KB at the default 2000-token budget, ~40 KB at the 10000-token # ceiling — so this bounds history growth. Oldest revisions are pruned as new # ones land, and the cap is also applied across every topic at startup, so # lowering it reclaims history from topics that have stopped updating. # Config-only: there is no field for this on the Settings page. knowledge_revision_limit: 50 # Number of days to retain articles before automatic cleanup # Older articles are deleted daily at 4 AM article_retention_days: 90 # --- Advanced settings (optional, sensible defaults) --- # Set the Secure flag on cookies. Enable when TLS is terminated at a reverse # proxy (recommended for any remote deployment — see SECURITY.md). Default: false. # secure_cookies: true # llm_temperature: 0.2 # min_confidence_threshold: 0.7 # min_relevance_threshold: 0.5 # Consecutive checks with no usable source before a "sources failing" alert. # Counted in checks, not hours. Set to 0 to turn the heartbeat off. # silence_heartbeat_checks: 3 # web_page_size: 20 # feed_max_retries: 2 # content_fetch_concurrency: 3 # topic_check_concurrency: 3 # scheduler_misfire_grace_time: 300 # scheduler_jitter_seconds: 30 # llm_max_retries: 2