Initial commit: AVWatch v1.0.0 with .gitignore and CLAUDE.md

This commit is contained in:
2026-09-24 13:07:21 -04:00
commit ea70a9cb5f
38 changed files with 9604 additions and 0 deletions
+138
View File
@@ -0,0 +1,138 @@
# AVWatch configuration
# Copy to config.toml and edit. Secrets go in environment variables, never
# here, so this file is safe to keep on a shared drive or in git.
#
# AVWATCH_SMTP_PASSWORD mail app password
# ANTHROPIC_API_KEY enables the Claude verdict + version lookup
# AVWATCH_GITHUB_TOKEN lifts GitHub's 60/hour limit to 5000/hour
# AVWATCH_REDDIT_CLIENT_ID free "script" app at reddit.com/prefs/apps
# AVWATCH_REDDIT_CLIENT_SECRET
[general]
cache_ttl = 3600 # seconds to reuse an HTTP response
http_timeout = 30
log_level = "INFO" # DEBUG when something is misbehaving
[paths]
# All relative to the project folder unless you give absolute paths.
# data_dir = "data"
# report_dir = "reports"
# inventory = "inventory.yaml"
# ---------------------------------------------------------------------------
# Email digest
# ---------------------------------------------------------------------------
[email]
enabled = true
# --- Microsoft 365 -----------------------------------------------------
# smtp_host = "smtp.office365.com"
# smtp_port = 587
# use_starttls = true
# username = "avwatch@yourchurch.org"
# With MFA on the account you must create an app password, and the mailbox
# needs SMTP AUTH enabled (it is off by default on new M365 tenants):
# Exchange admin centre -> Mailboxes -> the mailbox -> Manage email apps
# -> tick "Authenticated SMTP".
#
# --- Google Workspace --------------------------------------------------
smtp_host = "smtp.gmail.com"
smtp_port = 587
use_starttls = true
use_ssl = false
username = "your.address@waterschurch.org"
# Requires an App Password (myaccount.google.com -> Security -> 2-Step
# Verification -> App passwords). Your normal password will be rejected.
from_addr = "your.address@waterschurch.org"
from_name = "AVWatch"
# Who gets the Monday briefing.
to = [
"chris.meireles@waterschurch.org",
]
cc = []
subject_prefix = "[AVWatch]"
attach_html = true # attach the full dashboard to the email
send_when_nothing_new = true # false = stay silent on quiet weeks
# ---------------------------------------------------------------------------
# Community risk scanning
# ---------------------------------------------------------------------------
[risk]
enabled = true
# Only scan the forums for items we are actually behind on. Turning this off
# scans everything and takes a great deal longer.
only_when_behind = true
max_queries_per_item = 2
max_evidence_per_item = 8
lookback_days = 400
use_duckduckgo = true # works with no key, but rate-limits hard
use_reddit = true # needs the two AVWATCH_REDDIT_* env vars
use_github_issues = true # best signal for OBS / Companion / RustDesk
use_hackernews = false # low yield for AV gear
# Searched via the Reddit API when credentials are present.
subreddits = [
"livesound",
"VIDEOENGINEERING",
"churchtech",
"ProPresenter",
"blackmagicdesign",
"audioengineering",
"shure",
"sounddesign",
]
# ---------------------------------------------------------------------------
# Verdict engine
# ---------------------------------------------------------------------------
[llm]
enabled = true
model = "claude-opus-5"
# Cheaper alternative if the Opus verdicts read as more than you need:
# model = "claude-sonnet-5"
escalate_model = "claude-opus-5"
escalate_for_criticality = ["showstopper"]
max_output_tokens = 1400
# ---------------------------------------------------------------------------
# Version lookup for vendors with no machine-readable feed
# ---------------------------------------------------------------------------
# Most AV vendor support sites are JavaScript-rendered and cannot be scraped.
# For those, Claude looks the version up with web search and cites a source.
# This is factual retrieval rather than judgement, so it runs on the cheaper
# model. Answers are cached for ttl_days, so the Monday digest pays for the
# lookups and mid-week scans reuse them.
[lookup]
enabled = true
model = "claude-sonnet-5"
ttl_days = 6.0
max_items_per_run = 120 # hard ceiling on cost per run
max_searches_per_item = 4
# ---------------------------------------------------------------------------
# Local policy -- your rules, independent of what the internet says
# ---------------------------------------------------------------------------
[policy]
# How long a release must have been out before it is recommended, by how much
# the gear matters. These are the main dials worth tuning.
soak_days_showstopper = 30
soak_days_high = 21
soak_days_normal = 10
# ISO weekdays where an install should never be scheduled (1 = Monday).
# Saturday and Sunday by default.
blackout_weekdays = [6, 7]
# Require a human decision for a major version jump on show-critical gear.
major_bump_needs_human = true