Stacked on !6; retarget to main once that merges.
Switches templates to html/template, escapes every DeviantArt-supplied string in the Go-built fragments and hands them over as template.HTML, and shares the same escaping with the Atom feed. ParseDescription's HTML branch now emits its whitelisted tags bare rather than copying their attributes. The 502 page shows only the first line of the upstream error, escaped.
Six new tests cover template rendering under html/template, the reflected query, listing titles in HTML and Atom, comment usernames, description text, and the error page. Lint clean; passes with and without -tags embed.
retargeted from ci/pipeline to main: !6 merged
2026-09-11 15:13 UTC