Spelling matters: the domain is bwscomputerservice.com — “service” with the i. The i-less bwscomputerservce.com is a different string that is not registered and does not resolve; don’t point tooling at it.
| Aspect | Value |
|---|---|
| DNS / hosting | Cloudflare (NS maciej/nora.ns.cloudflare.com, A 104.21.64.100 / 172.67.181.21) |
| Registration | paid 10 years |
| TLS cert | Google Trust Services (Cloudflare), auto-renewed; ~90-day validity windows |
| Email MX | ProtonMail (mail.protonmail.ch, mailsec.protonmail.ch) |
| SPF | v=spf1 include:_spf.protonmail.ch ~all |
| DMARC | v=DMARC1; p=quarantine |
| Site | HTTPS 200 via Cloudflare |
| Security headers | HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy all present |
domain-monitor.sh, added 2026-07-12)READ-ONLY external probe of the domain — never changes anything, only reports. Because the domain is paid 10 years and the cert auto-renews, this is a “verify the automation is still working” net rather than a calendar reminder. Each run checks, and alerts to Discord only on drift:
_spf.protonmail.ch, DMARC still present. Catches both disappearance and malicious change (e.g. a DNS hijack repointing mail).Success is silent (so no daily noise); any failure sends one red Discord embed listing every issue found. --always-notify forces a green confirmation for testing.
/home/aztechguy/.local/bin/domain-monitor.sh/home/aztechguy/domain-monitor.log~/.config/discord-webhooks/domain.txt (currently seeded with the stocks webhook as a placeholder — create a dedicated domain/infra channel and paste its URL here to segregate)domain-monitor.sh --always-notifyThe script’s dig queries go straight to 1.1.1.1 (Cloudflare DNS). If the box’s
network is down or mid-VPN-reconnect at 5:40 AM, every query times out and the check
misreads “no DNS answer” as “record GONE” — the log fills with:
;; communications error to 1.1.1.1#53: timed out
;; no servers could be reached
SPF record missing or changed (expected '_spf.protonmail.ch'; got: none).
DMARC record missing or changed ...
…and the morning briefing’s 🌐 Domain line shows the tail of that wreckage. The domain is fine — the checker was blind. First observed 2026-07-19 after an overnight VPN blip (the same blip that stalled the 5:45 briefing); the three prior mornings all PASSed, and a manual re-check that same morning resolved instantly with the site at HTTP 200.
How to tell false alarm from real problem: communications error / no servers could be reached in the log = network-side (false alarm). A real record change
shows a clean dig answer with the wrong value. To confirm, re-run by hand once the
network is up:
dig +short bwscomputerservice.com A # expect the two Cloudflare IPs
curl -s -o /dev/null -w "%{http_code}\n" https://bwscomputerservice.com # expect 200
/home/aztechguy/.local/bin/domain-monitor.sh --always-notify # full re-check
Guard added same day (2026-07-19): the script now runs a network preflight before any checks — it resolves a known-good name first. Outcomes:
SKIP: network/DNS down -- domain check inconclusive, not alerting and exits 0.
No red Discord embed, no false “SPF missing.” The briefing shows the SKIP line.All three branches were force-tested on 2026-07-19 (normal PASS; simulated dead probe → NOTE + PASS via system resolver; simulated full outage → SKIP exit 0). Related quirk found while testing: the box’s VPN intercepts all DNS (queries to any resolver IP get answered while the tunnel is up) — so when the tunnel blips, DNS dies completely at once, which is exactly the mode this guard covers.
If you intentionally change providers (e.g. move email off ProtonMail, or adjust headers), update the EXPECT_MX / EXPECT_SPF / EXPECT_DMARC / REQUIRED_HEADERS baseline values at the top of the script, or it will (correctly) alert that the live config no longer matches the recorded baseline.