We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Data-Pipeline: document PCGamingWiki enricher (cols 14 + 15) + cache files (#377 slice 1)
docs: reflect Cloudflare Pages migration + new admin tabs Update every affected page to describe the post-#362 architecture (CF Pages projects for staging + prod, R2 bucket for per-game data, publish-shell.yml auto-deploy) and preserve the GH Pages path as rollback only. Retire the cert-renewal page with a banner but keep the walkthrough intact for the rollback path. Add two new pages documenting the admin observability surfaces: - Admin-Logging-Tab: localStorage ring buffer + the mobile debug workflow that replaces remote devtools - Admin-Deployments-Tab: last 15 deploy runs across the four deploy workflows, cached 45s to stay under the 60/hr GH API limit Link both from Home.md.
Cert wiki: add security note + Cloudflare Pages hardening path
Cert wiki: document final config (Cloudflare Full non-strict, origin cert left expired) not WIP options
Cert wiki: warn that Cloudflare Automatic SSL/TLS auto-upgrades to Strict and 526s; pin explicit Full
Rewrite cert page: two-hop model, Path A/B, #359 monitoring + make check-cert
docs: add GitHub-Pages-Cert-Renewal walkthrough Covers the bad_authz recovery path (Cloudflare proxy eating the ACME HTTP-01 challenge) that make renew-certificate scripts against. Also records why we deliberately do NOT read cert expiry out-of-band from the GitHub Pages REST API -- avoids putting a PAT on the edge-status worker.
docs: update per-game aggregation to match unified web algorithm
docs(security): document status.html CSP connect-src whitelist (#341)
docs(runbook): add security scanners + moderation infra recovery steps - New "Security scanner + moderation infrastructure" section under Phase 1 documenting semgrep.yml, sbom.yml, .grype.yaml, security-monitor, and the proton-pulse-data content moderation script + content-moderation-review label - Phase 2.2 now notes the sibling proton-pulse-data secrets that need populating too + the gh label create for the review label - Phase 5 verification checklist gets four new checks: semgrep + sbom green on PR, SBOM artifact present, aux moderation scan ran, label exists - OPENAI_API_KEY row in Phase 1 flags dual-repo use - Related pages: added Security Guardrails + Content Moderation
docs(moderation): add sysinfo_text + reason_text aux scans + issue rate limit
docs(moderation): scanner now covers user_proton_configs.app_name + user_systems.label (#331, #332)
docs(security): document per-IP rate-limit abuse alerts (#320)
docs(moderation): add coverage audit table (#319)
docs(security): add Semgrep, SBOM+Grype, and Quarterly restore drill sections (mdeguzis/proton-pulse-web#316, #317, #322)
docs: add SECURITY.md disclosure policy section (mdeguzis/proton-pulse-web#313)
docs: add CWE/OWASP references to all findings and standards section
docs: update Safety page with tech stack, attack surface, best practices; mark all pentest findings fixed
docs: add Safety and Security page with pentest sub-page
user_systems now owner-only RLS + deleted on erasure (#283)
Drop 'opt-in' framing; describe as auto-on-first-use with public-profile as the only opt-out Match the current implementation reality: library syncs automatically on first profile visit, wishlist on first browse-chip activation. There is no in-app opt-out toggle -- Steam's Public profile visibility is the effective opt-out because a non-Public profile returns nothing.
Add privacy-relevant summary of how library/wishlist gets fetched Referenced from the privacy page and the About Your Data section so anyone asking 'does Steam sign-in transfer my library?' lands on a direct answer: sign-in does not, it is a separate opt-in sync, we call GetOwnedGames / GetWishlist server-side with our Steam Web API key, and Steam only returns data if the user's profile visibility is public.
Document user_systems field validation constraints (#283)
Erasure now scrubs and keeps user_systems instead of deleting (#283)
Document admin_erase_user anonymize-on-erase + admin_audit_log (#283)
Site status: document Cloudflare worker cron, latency sparkline, admin check-now, make deploy-worker (#275)
docs: add Restore Runbook (disaster recovery + handoff, #265)
docs: prominent Get involved section on wiki Home (staging-first PR reminder)
docs: add Site Status Page wiki (#254)
docs: Security-Guardrails page for the issue-attachment scanner (#228)