I have been a bad blogger.

For the last 10 years my feeds have contained sad little text-only snippets (actually the first 30 words) instead of the complete contents of each post. This was pure laziness on my part. When I wrote the software that generates this site I couldn't be bothered to figure out how to do it properly. I always knew it was wrong but it took until today for me to finally do something about it.
As a technical aside, I find RSS an annoying format to work with. Dumping CDATA blobs all over the place seems like the wrong approach and having to make sure all your resources are specified as absolute URLs was a real pain point for me.
But we work with what we have, and from today reading sheep.horse in a feedreader should be a lot more pleasant.
Update: Turns out the python library I am using to generate atom feeds is a little wonky. The atom feed has been fixed as well with some judicious post-processing of the xml.
For those interested, feedgen conflates the type of the entry node with whether you want it CDATA'ed. For atom, as best as I can determine, the content node should have type "html" and the text should be wrapped in CDATA. Feedgen just refuses to output this combination, only using CDATA if the type is "CDATA", which breaks atom readers.
The latest version of gensite does the following little dance to set the types to what readers expect.
# feedgen has a weird and incorrect way of generating atom feeds where it explicitly # sets the type of content nodes to CDATA, which is incorrect. Manually go through and # set them to "html" atom_string = fg.atom_str(pretty=True) parser = lxml.etree.XMLParser(strip_cdata=False) atom_root = lxml.etree.fromstring(atom_string, parser) cdata_nodes = atom_root.xpath("//*[@type='CDATA']") for node in cdata_nodes: node.set('type', 'html') atom_string = lxml.etree.tostring(atom_root, pretty_print=True, method='xml').decode() with open(os.path.join(destdir, 'atom.xml'), "w", encoding="utf-8") as file: file.write(atom_string)