<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Hyperlink Your Heart - indieweb</title><link href="https://blog.hyperlinkyourheart.com/" rel="alternate"></link><link href="https://blog.hyperlinkyourheart.com/feeds/tag.indieweb.atom.xml" rel="self"></link><id>https://blog.hyperlinkyourheart.com/</id><updated>2025-06-12T15:23:00+02:00</updated><subtitle>Until there's nothing left.</subtitle><entry><title>Image Optimisation</title><link href="https://blog.hyperlinkyourheart.com/image-optimisation.html" rel="alternate"></link><published>2021-05-30T00:27:00+02:00</published><updated>2021-06-01T13:20:00+02:00</updated><author><name>Kevin Houlihan</name></author><id>tag:blog.hyperlinkyourheart.com,2021-05-30:/image-optimisation.html</id><summary type="html">&lt;p&gt;Image optimisation experiments and a helpful Pelican&amp;nbsp;plugin&lt;/p&gt;</summary><content type="html">&lt;p&gt;In the &lt;a href="https://blog.hyperlinkyourheart.com/energy-usage-update.html"&gt;last instalment&lt;/a&gt; of my epic blogging saga I recounted my discovery that the index page of this site had grown to over 1.&lt;span class="caps"&gt;7MB&lt;/span&gt; of content when loaded fresh, largely due to the images. One of my goals for this site was that it be lean - fast to load and energy efficient - and it was not meeting that goal at all. Clearly avoiding Javascript and &lt;span class="caps"&gt;CSS&lt;/span&gt; frameworks was not&amp;nbsp;enough!&lt;/p&gt;
&lt;p&gt;I immediately started thinking about how to improve the situation. Though I had previously ruled out the approach used by &lt;a href="https://solar.lowtechmagazine.com/about.html" title="Low-tech magazine solar powered web site"&gt;Low-tech magazine&amp;#8217;s solar-powered website&lt;/a&gt; because I didn&amp;#8217;t think it would fit my aesthetic, I decided to see if dithering coloured, rather than monochrome, PNGs would work better for me, and improve on the size and quality of an appropriately-sized 75% quality &lt;span class="caps"&gt;JPEG&lt;/span&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;span class="caps"&gt;PNG&lt;/span&gt;&amp;nbsp;Thunderdome&lt;/h2&gt;
&lt;p&gt;The one to beat - baseline 75% &lt;span class="caps"&gt;JPEG&lt;/span&gt;, Size:&amp;nbsp;16.1kb&lt;/p&gt;
&lt;p&gt;&lt;img alt="melanie-pointing_alpha_baseline.jpg" class="poi-no-optimise" src="https://blog.hyperlinkyourheart.com/images/image-optimisation/melanie-pointing_alpha_baseline.jpg" title="melanie-pointing_alpha_baseline.jpg: 16.1kb"&gt;&lt;/p&gt;
&lt;p&gt;Using &lt;a href="https://python-pillow.org/" title="Pillow"&gt;Pillow&lt;/a&gt; and the same &lt;a href="https://github.com/hbldh/hitherdither" title="hitherdither library"&gt;hitherdither&lt;/a&gt; library that Low-tech magazine used for their site, I iterated on a script that output hundreds of compressed variations of a given image using different dithering algorithms and&amp;nbsp;parameters.&lt;/p&gt;
&lt;p&gt;The best results I found were with the Bayesian algorithm with a 32 colour palette, a 2x2 matrix, and an image size half the expected display size. This produced a result that was relatively readable, and reminiscent of pixel art. The size savings varied by image - sometimes up to 10kB, but often only 2-3kB as for this example. These savings are modest compared to the loss in detail, and I think this approach could only be considered because of the unique aesthetic it&amp;nbsp;produces.&lt;/p&gt;
&lt;p&gt;Palette: 32, Dither: bayer, Threshold: 256/8-256-256/8, Order: 2, Size:&amp;nbsp;13.9kb&lt;/p&gt;
&lt;p&gt;&lt;img alt="melanie-pointing_alpha_halved_pal32_dithbayer_order2_thresh8-1-8.png" class="poi-no-optimise" src="https://blog.hyperlinkyourheart.com/images/image-optimisation/melanie-pointing_alpha_halved_pal32_dithbayer_order2_thresh8-1-8.png" title="melanie-pointing_alpha_halved_pal32_dithbayer_order2_thresh8-1-8.png: 13.9kb"&gt;&lt;/p&gt;
&lt;p&gt;The three &amp;#8220;threshold&amp;#8221; parameters expected by hitherdither were a bit of a mystery to me. Through trial and error I found that some produced much smaller images, but unfortunately not at a level of quality that I found acceptable. Lower palette sizes also resulted in savings, but below 32 colours they started to look too abstract and unreadable to&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;Palette: 32, Dither: bayer, Threshold: 256/2-256-256/2, Order: 2, Size:&amp;nbsp;9.6kb&lt;/p&gt;
&lt;p&gt;&lt;img alt="melanie-pointing_alpha_halved_pal32_dithbayer_order2_thresh2-1-2.png" class="poi-no-optimise" src="https://blog.hyperlinkyourheart.com/images/image-optimisation/melanie-pointing_alpha_halved_pal32_dithbayer_order2_thresh2-1-2.png" title="melanie-pointing_alpha_halved_pal32_dithbayer_order2_thresh2-1-2.png: 9.6kb"&gt;&lt;/p&gt;
&lt;h2&gt;A Challenger&amp;nbsp;Appears&lt;/h2&gt;
&lt;p&gt;I was about ready to commit to this approach and start converting all the images when my wife reminded me that &lt;span class="caps"&gt;WEBP&lt;/span&gt; exists! After converting a few of my test images to &lt;span class="caps"&gt;WEBP&lt;/span&gt; it was clear that it had my dithered PNGs beat - half the size of the &lt;span class="caps"&gt;JPEG&lt;/span&gt; without any loss of&amp;nbsp;quality.&lt;/p&gt;
&lt;p&gt;80% quality &lt;span class="caps"&gt;WEBP&lt;/span&gt;, Size:&amp;nbsp;9.9kb&lt;/p&gt;
&lt;p&gt;&lt;img alt="melanie-pointing_alpha_baseline.webp" class="poi-no-optimise" src="https://blog.hyperlinkyourheart.com/images/image-optimisation/melanie-pointing_alpha_baseline.webp" title="melanie-pointing_alpha_baseline.webp: 9.9kb"&gt;&lt;/p&gt;
&lt;p&gt;Apparently &lt;a href="https://caniuse.com/?search=webp" title="WEBP support"&gt;support for &lt;span class="caps"&gt;WEBP&lt;/span&gt;&lt;/a&gt; is pretty good these days, but there are a couple of annoying outliers - Safari only supports it on Big Sur, and &lt;span class="caps"&gt;IE11&lt;/span&gt; still exists, as I&amp;#8217;m sure it always&amp;nbsp;will.&lt;/p&gt;
&lt;p&gt;As such, I decided I should probably try and fallback gracefully to a &lt;span class="caps"&gt;JPEG&lt;/span&gt; or &lt;span class="caps"&gt;PNG&lt;/span&gt; where &lt;span class="caps"&gt;WEBP&lt;/span&gt; isn&amp;#8217;t supported. This can be achieved using &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; elements to allow the browser to choose the format it likes&amp;nbsp;best.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;picture&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;image/webp&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;srcset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{optimal image url}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;image/jpeg&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;srcset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{compatible image url}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{compatible image url}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;picture&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Let&amp;#8217;s&amp;nbsp;Automate&lt;/h2&gt;
&lt;p&gt;The above &lt;span class="caps"&gt;HTML&lt;/span&gt; snippet presents a problem - my posts are not written in &lt;span class="caps"&gt;HTML&lt;/span&gt; but in Markdown, and processed by &lt;a href="https://blog.getpelican.com/" title="Pelican static site generator"&gt;Pelican&lt;/a&gt; into &lt;span class="caps"&gt;HTML&lt;/span&gt;, and that process just results in an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag by&amp;nbsp;default.&lt;/p&gt;
&lt;p&gt;I threw together &lt;a href="https://github.com/khoulihan/pelican-optimise-images" title="pelican-optimise-images plugin"&gt;a quick Pelican plugin&lt;/a&gt; to post-process the generated &lt;span class="caps"&gt;HTML&lt;/span&gt; and replace any &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags with &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; tags, if the referenced images could be replaced with WEBPs. It also processes the referenced images to create scaled &lt;span class="caps"&gt;JPEG&lt;/span&gt;/&lt;span class="caps"&gt;PNG&lt;/span&gt; versions as well as the &lt;span class="caps"&gt;WEBP&lt;/span&gt; version, so I don&amp;#8217;t have to do any of that manually&amp;nbsp;either.&lt;/p&gt;
&lt;h2&gt;Results&lt;/h2&gt;
&lt;p&gt;The index of the blog is now 778kB at the time of writing - so reduced by over half! I did also replace a particularly large and troublesome &lt;span class="caps"&gt;GIF&lt;/span&gt; with a static image as well, and converted some PNGs to JPEGs. This results in greater savings because the plugin converts PNGs to lossless WEBPs and JPEGs to lossy&amp;nbsp;ones.&lt;/p&gt;
&lt;p&gt;The plugin is actually not even working fully yet - for some reason it is missing some &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags on the index pages, leaving them serving their original unprocessed&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;I also haven&amp;#8217;t done anything about the pixel art images, which if served at their original resolution could be a significant&amp;nbsp;saving.&lt;/p&gt;
&lt;p&gt;So in short, &lt;a href="https://www.websitecarbon.com/website/blog-hyperlinkyourheart-com/" title="76th percentile for energy efficiency"&gt;huge progress&lt;/a&gt;, but still much scope for&amp;nbsp;improvement!&lt;/p&gt;
&lt;p&gt;I am almost sorry I&amp;#8217;m not going to end up using these dithered PNGs&amp;nbsp;though&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tracer and Chun-Li" class="poi-no-optimise" src="https://blog.hyperlinkyourheart.com/images/image-optimisation/tracer_alpha_halved_pal32_dithbayer_order2_thresh8-1-8.png" title="Wow looks like videogams"&gt;&lt;/p&gt;
&lt;h3&gt;Update&amp;nbsp;01/06/2021&lt;/h3&gt;
&lt;p&gt;I fixed the problem with the plugin and all images are now optimised except the few in this post that are flagged to be skipped. I also swapped out all the pixel art images and gifs for 1x resolution versions. These are just being scaled up by &lt;span class="caps"&gt;CSS&lt;/span&gt;, with reasonable&amp;nbsp;results.&lt;/p&gt;
&lt;p&gt;The index page is now 539kB, the whole site is just over &lt;span class="caps"&gt;1MB&lt;/span&gt;, and it is in the 80th percentile for energy usage according to websitecarbon.com (whatever that&amp;#8217;s worth). I think the link above showed 75th or 76th percentile or thereabouts at the time of posting, but it will show 80th&amp;nbsp;now.&lt;/p&gt;</content><category term="Meta"></category><category term="indieweb"></category><category term="blogging"></category></entry><entry><title>Energy Usage Update</title><link href="https://blog.hyperlinkyourheart.com/energy-usage-update.html" rel="alternate"></link><published>2021-05-27T13:20:00+02:00</published><updated>2025-06-12T15:23:00+02:00</updated><author><name>Kevin Houlihan</name></author><id>tag:blog.hyperlinkyourheart.com,2021-05-27:/energy-usage-update.html</id><summary type="html">&lt;p&gt;An update on the energy efficiency of this&amp;nbsp;blog.&lt;/p&gt;</summary><content type="html">&lt;p&gt;When I &lt;a href="https://blog.hyperlinkyourheart.com/remember-blogs.html"&gt;started this blog&lt;/a&gt;, one of my &lt;a href="https://blog.hyperlinkyourheart.com/embedding-svgs.html"&gt;goals&lt;/a&gt; was for it to be lean and efficient, both to improve the reader&amp;#8217;s experience and to reduce the power usage involved in serving&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been planning recently to write a post on a related topic - the energy efficiency of the Python language and how using it as the backend or &lt;span class="caps"&gt;API&lt;/span&gt; of a more dynamic website would fit with those same goals. In preparation for that, I thought to check in on this blog and whether it is still as lean as it was back when I was figuring out how to embed the &lt;span class="caps"&gt;SVG&lt;/span&gt; icons in&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Unfortunately, it seems that it is not. Unlike one of my inspirations, &lt;a href="https://solar.lowtechmagazine.com/2018/09/how-to-build-a-lowtech-website.html"&gt;low-tech magazine&amp;#8217;s solar powered website&lt;/a&gt;, I never found a solution for reducing the size of image files. For my posts about &lt;span class="caps"&gt;TV&lt;/span&gt; shows and movies I use fairly low quality JPEGs. But for my art and game dev posts I have been unwilling to compromise, and, frankly, a bit lazy, and have just been throwing large PNGs and GIFs into my posts without thinking about their&amp;nbsp;size.&lt;/p&gt;
&lt;p&gt;As a result, loading the index of this site now transfers 1.&lt;span class="caps"&gt;7MB&lt;/span&gt; if nothing is already cached. The text content and &lt;span class="caps"&gt;CSS&lt;/span&gt; are in the tens of kilobytes, with the rest being images. This is comparable to the initial load of many corporate news sites and large blogs with all their tracking javascript and ads blocked - an improvement over the norm perhaps, since I&amp;#8217;m not doing any of the tracking or advertising that have become such a burden on the web, but not particularly notable. This site is now only in the &lt;a href="https://www.websitecarbon.com/website/blog-hyperlinkyourheart-com/"&gt;57th percentile according to websitecarbon.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For pixel art, one solution does present itself immediately. For my &lt;a href="https://portfolio.hyperlinkyourheart.com"&gt;portfolio site&lt;/a&gt;, all of the artwork is sent to the browser at 1x resolution and resized there by an integer factor by a small amount of javascript, and perhaps the same thing could be achieved with css. The index of that site is under 400kB despite including all of my artwork, and does not require specially resized image thumbnails or anything like that. I could do the same thing here instead of throwing manually resized art into&amp;nbsp;posts.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m less sure what to do about screenshots and screencaps. The solution used by low-tech magazine doesn&amp;#8217;t really work for me, I think it compromises the readability of the images too much and doesn&amp;#8217;t fit this site&amp;#8217;s aesthetic. I tried a number of different techniques for vectorising, posterising and dithering screencaps from &lt;span class="caps"&gt;TV&lt;/span&gt; shows and movies to reduce the number of colours, but they didn&amp;#8217;t result in significant savings. On the other hand, they did actually look kind of cool and&amp;nbsp;stylised!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Vectorised Beth Harmon" src="https://blog.hyperlinkyourheart.com/images/energy-usage-update/parkchesscrowd_vector.jpg" title="Vectorised Beth Harmon"&gt;&lt;/p&gt;
&lt;p&gt;Something I should probably try is scaling such images down significantly and then back up to the required display size in &lt;span class="caps"&gt;CSS&lt;/span&gt;. Obviously this will degrade the quality, but it might be an acceptable&amp;nbsp;trade-off.&lt;/p&gt;
&lt;p&gt;Screenshots of things like a text-editor or &lt;span class="caps"&gt;IDE&lt;/span&gt; are even more problematic - if the quality is degraded there they are probably not useful. I will probably just have to try to keep that kind of thing to a minimum, and use tighter crops where&amp;nbsp;necessary.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s easy to become complacent about efficiency when computers are so powerful that a few tens or hundreds of kilobytes don&amp;#8217;t seem to cause them any strain, but when you have that mindset they can quickly add up to quite a significant waste of time and power. I think this is well demonstrated by &lt;a href="https://daringfireball.net/linked/2018/05/27/usa-today-gdpr"&gt;&lt;span class="caps"&gt;USA&lt;/span&gt; Today&amp;#8217;s pissy response to the &lt;span class="caps"&gt;GDPR&lt;/span&gt;&lt;/a&gt;, where instead of the usual 5.&lt;span class="caps"&gt;2MB&lt;/span&gt; bloated garbage site, readers from the &lt;span class="caps"&gt;EU&lt;/span&gt; were served a lean, content focused site that loaded almost instantly and didn&amp;#8217;t track&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;Nothing I do is going to have the kind of impact that a site like &lt;span class="caps"&gt;USA&lt;/span&gt; Today improving their efficiency would have, purely because of the scale of the traffic involved, but I still want to try to do&amp;nbsp;better.&lt;/p&gt;</content><category term="Meta"></category><category term="indieweb"></category><category term="blogging"></category><category term="pixelart"></category></entry><entry><title>Remember Blogs?</title><link href="https://blog.hyperlinkyourheart.com/remember-blogs.html" rel="alternate"></link><published>2020-01-02T20:05:00+01:00</published><updated>2020-01-02T20:05:00+01:00</updated><author><name>Kevin Houlihan</name></author><id>tag:blog.hyperlinkyourheart.com,2020-01-02:/remember-blogs.html</id><summary type="html">&lt;p&gt;The how and the why of this very blog right&amp;nbsp;here.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I&amp;#8217;ve read a lot of articles recently (&lt;a href="https://omarabid.com/the-modern-web"&gt;here&amp;#8217;s one&lt;/a&gt;) lamenting the state of the web. Once distributed, egalitarian, ungovernable, and fast, now centralised, intentionally manipulative, and bloated both technically and conceptually. Even when you manage to fight your way through the popups demanding your attention or personal information, often what is underneath is not worth the effort - more likely a vehicle for advertising than for&amp;nbsp;insight.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also incredibly power-hungry. It&amp;#8217;s hard to tie down an exact figure for exactly &lt;em&gt;how&lt;/em&gt; power-hungry, but the internet as a whole &lt;a href="https://newrepublic.com/article/155993/can-internet-survive-climate-change"&gt;could account for up to 10% of global energy use&lt;/a&gt;. A good chunk of that is streaming video and music, which is a topic for another day, but of the power consumed in serving the web, some of it is related to actual valuable content that people want to see, and some of it is related to the trends described above. The latter is waste. At least bloated JavaScript and &lt;span class="caps"&gt;CSS&lt;/span&gt; frameworks can be cached, but advertising has to be constantly served&amp;nbsp;anew.&lt;/p&gt;
&lt;p&gt;So, anyway, all this to say&amp;#8230; I&amp;#8217;ve decided to start a&amp;nbsp;blog.&lt;/p&gt;
&lt;h2&gt;The&amp;nbsp;Tech&lt;/h2&gt;
&lt;p&gt;My technical goals for this website are for it to&amp;nbsp;be&amp;#8230;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightweight &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; fast to load&lt;/strong&gt; - I set up a WordPress site recently, on the best hosting I can afford. It is not lightweight or fast to&amp;nbsp;load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content focused&lt;/strong&gt; - Read one thing or read them all, but I&amp;#8217;m sure you can only read one article at a&amp;nbsp;time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nice to look at&lt;/strong&gt; - Apparently it &lt;a href="https://perfectmotherfuckingwebsite.com/"&gt;doesn&amp;#8217;t take much&lt;/a&gt;. Also going for consistent &lt;em&gt;branding&lt;/em&gt; between all my sites and&amp;nbsp;profiles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responsive&lt;/strong&gt; - Readable on phones as well as&amp;nbsp;desktops!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy to deploy&lt;/strong&gt; - I don&amp;#8217;t have time to configure and maintain a teetering stack of back-end technology, and if I have to move to different hosting at some point, I want it to be a simple&amp;nbsp;task.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy to update&lt;/strong&gt; - If writing posts is a chore, I won&amp;#8217;t ever do&amp;nbsp;it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hackable&lt;/strong&gt; - Created using technologies that I&amp;#8217;m somewhat familiar with, so that it is feasible for me to modify or extend if I want/need&amp;nbsp;to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I decided almost immediately that a statically-generated site was going to be the best way to achieve most of those goals. I&amp;#8217;m a big fan of Python, so although &lt;em&gt;hackability&lt;/em&gt; could be achieved by a JavaScript or C# based generator, I checked out the Python ones first, and found plenty of viable options. I settled on &lt;a href="https://blog.getpelican.com/"&gt;Pelican&lt;/a&gt; because&amp;nbsp;it&amp;#8217;s&amp;#8230;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Popular&lt;/strong&gt; - It seems to be one of the more popular Python&amp;nbsp;generators.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blog-oriented&lt;/strong&gt; - Some generators are geared towards documentation or are intended as replacements for content management systems, but that&amp;#8217;s not what I&amp;#8217;m&amp;nbsp;doing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supports Markdown&lt;/strong&gt; - I&amp;#8217;m sure reST is fine, but I already have to use Markdown elsewhere so I&amp;#8217;d rather stick with&amp;nbsp;that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy to update&lt;/strong&gt; - Just create a new Markdown file and run a command to&amp;nbsp;rebuild.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensible&lt;/strong&gt; - It includes a plugin system to modify the&amp;nbsp;output.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also decided to hand-craft my own theme, and to avoid a &lt;span class="caps"&gt;CSS&lt;/span&gt; framework. I love the look of Bootstrap, and how quick it is to get started with, but it&amp;#8217;s over 200kb and a lot of that is undoubtedly unnecessary for my needs. The spirit of the exercise is bare-bones and &lt;span class="caps"&gt;DIY&lt;/span&gt;!&lt;/p&gt;
&lt;h3&gt;The&amp;nbsp;Theme&lt;/h3&gt;
&lt;p&gt;The first step in hand-crafting a theme was&amp;#8230; to find an existing theme to copy! &lt;a href="https://github.com/arulrajnet/attila"&gt;Atilla&lt;/a&gt; was the closest to the style I was after, so I took a copy of that and gutted it of &lt;span class="caps"&gt;CSS&lt;/span&gt; and JavaScript and other elements that didn&amp;#8217;t meet my needs. Then I started building the &lt;span class="caps"&gt;CSS&lt;/span&gt; back up while trying to keep it as minimal as possible. It may not implement every feature supported by Pelican, but you can find it &lt;a href="https://github.com/khoulihan/hyh-blog/tree/master/themes/hyper"&gt;on my Github&lt;/a&gt; if it seems like something you could adapt for your own&amp;nbsp;needs.&lt;/p&gt;
&lt;p&gt;One departure that I made from the standard Pelican configuration was to have the social media links be taken from a collection of tuples with three elements, so that I could specify both an icon and a title to&amp;nbsp;use.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Custom social list that includes icons&lt;/span&gt;
&lt;span class="n"&gt;SOCIAL_ICONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Twitter&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;twitter.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://twitter.com/http_your_heart&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Mastodon&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mastodon.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://mastodon.art/@hyperlinkyourheart&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Instagram&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;instagram.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://www.instagram.com/hyperlinkyourheart/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;YouTube&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;youtube.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://www.youtube.com/channel/UCc_O9Hp5UfQ-IHswi1H54Zg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Twitch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;twitch.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://www.twitch.tv/hyperlinkyourheart&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Itch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;itchio.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://hyperlinkyourheart.itch.io/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;GitHub&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;github.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://github.com/khoulihan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Atom Feed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rss.svg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/feeds/all.atom.xml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I like that I can just throw custom configuration into the config file and then make use of it in the templates. However, it probably makes the theme less generally&amp;nbsp;useful.&lt;/p&gt;
&lt;p&gt;As it stands currently, loading this post requires less than 30kb to be&amp;nbsp;transferred.&lt;/p&gt;
&lt;h3&gt;Plugins&lt;/h3&gt;
&lt;p&gt;Currently, the only plugin I&amp;#8217;m using is the &lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/css-html-js-minify"&gt;css-html-js-minify&lt;/a&gt; plugin that is available in the pelican-plugins repository. I haven&amp;#8217;t found anything I need to write my own plugin to handle yet, but I&amp;#8217;m sure I will get to&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;One problem that needs solving is that the &lt;span class="caps"&gt;SVG&lt;/span&gt; icons are a big nuisance, because it doesn&amp;#8217;t seem to be possible to change their colour without using the &lt;span class="caps"&gt;CSS&lt;/span&gt; &lt;code&gt;filter&lt;/code&gt; property, which is not nearly as convenient as just setting the colour directly. In order to do that, using the &lt;code&gt;fill&lt;/code&gt; property, I would have to embed the SVGs, or reference them as symbols in a &lt;code&gt;&amp;lt;use&amp;gt;&lt;/code&gt; tag within an &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; tag. The individual icon files (from &lt;a href="https://fontawesome.com/"&gt;FontAwesome&lt;/a&gt;) aren&amp;#8217;t set up like that, and I didn&amp;#8217;t want to use their spritesheet because it is rather&amp;nbsp;large.&lt;/p&gt;
&lt;p&gt;What I might do in the future is write a plugin to compile the individual files into a single spritesheet of symbols, then find and replace any references to them with appropriate &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; tags. Essentially this will be doing the job that the FontAwesome toolkit usually does in the&amp;nbsp;browser.&lt;/p&gt;
&lt;h2&gt;The&amp;nbsp;Content&lt;/h2&gt;
&lt;p&gt;Uuuh&amp;#8230; I&amp;#8217;ll get back to you on that. Things I like, things I do, that sort of&amp;nbsp;thing.&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;There&amp;#8217;s a couple of different strategies for allowing comments on a static site - I&amp;#8217;m not going to attempt them for now, and perhaps never will! If you have any feedback or thoughts there are many ways to reach me, such as &lt;a href="https://mastodon.art/@hyperlinkyourheart"&gt;Mastodon&lt;/a&gt; or &lt;a href="https://twitter.com/http_your_heart"&gt;Twitter&lt;/a&gt;, and I think that&amp;#8217;s just&amp;nbsp;fine.&lt;/p&gt;</content><category term="Meta"></category><category term="indieweb"></category><category term="blogging"></category><category term="pelican"></category></entry></feed>