What Makes Good Blog Software?

2025-02-06Technology
Audio from Kokoro TTS (Apache 2.0)

This month, I made some beautification updates to my website and blog. And, that inspired me to take a look at the features nice blog software usually has.

The first thing to bring up here is that the features don’t matter unless you actually have something to say. But assuming that’s covered, your blog software can make your content really shine.

There’s a great divide between content management systems (CMS) and static site generators (SSG). I’m using an SSG. But I’ll discuss both here, because some features are easier for CMS’s to support than SSG’s.

But first, I’ll take a second to review what changed here. This is best shown in a side-by-side comparison.

Right away, you can see there’s a slick new font, a clear published date for the article, tags to organize content, and an audio version of the article!

I also added support for MathJax, which is transpiled to HTML at build time so no javascript is required at runtime.

I’ve had tags and year/month index pages for a while, but haven’t exposed them until now. But, the new audio is only viable (for self-hosters) now that Kokoro text-to-speech brought fast, decent quality speech to the masses.

Looking forward, what other things would be nice to add to the site? Since it’s a huge list, I’ve included a table of contents here:

With that out of the way, let’s dive in.

The Content Itself

Everything starts with the content itself. Having something to say helps. But, we’re talking about the software here. So, what this means is the markup that is supported.

The table stakes are headings, bold, italics, lists, quotes, and images. But beyond that, there’s a bunch of features that can make your content really shine:

Multi-Media: Video, Audio, Captions, Socials, and Embeds

Media First, there’s embedded media like video and audio files. Most people choose to host these large files on YouTube, a Podcast service, and other paid services. So the feature here is the ability to insert the proper HTML embed code.

But HTML does nicely support audio and video natively. And you can realistically host audio yourself. Though, video is a bit harder on the wallet.

For a really nice experience with HTML audio and video, you can progressively enhance by adding a Javascript rich player. The native players are fine. But I really appreciate a button to skip forward 30 seconds without having to click around.

I’ve found web components are a really excellent use case for this.

This will be all of us eventually.
This will be all of us eventually.

Captions These deserve special mention. Not only is this important for accessibility via alt tags. But, it is often also important for tracking attribution for images.

In HTML5, a great way to do this is using <figure> and <figcaption> tags. These separate your media and the caption, but still make it clear that the caption is associated with the media.

We have 4 more years of gems like this to look forward to.
We have 4 more years of gems like this to look forward to.

Social Media Building on the previous embeds, social media posts are another common embed. Most CMS & SSG systems have an escape hatch to just add arbitrary raw HTML.

Although my SSG does support inserting HTML, I strongly prefer not to do that so that the posts are reasonably portable.

And given the tumultuous history of these sites, I’d say it’s better to screenshot social media posts anyways.

Other Embeds can be really anything. Again, since most blog sites implement this as arbitrary HTML, you can do anything.

I think this more complex content is a great use case an iframe to isolate the complexity from your main content.

But either way (direct HTML or an iframe), these embeds are a great way to include interactive demos, calculators, visualizations, image galleries, 3D models, live data, and more.

For example, a math blog could use these to embed interactive graphs with adjustable parameters. Or, a finance blog could include an interactive demo of a model.

Tables & Diagrams

We live in a world of data, relationships, process, and complexity. And so your CMS/SSG should support displaying this info!

Name Age
Bob
Alice 23
Total 23

Tables The first major data representation is tables. A lot of software supports tables. But many leave the tables themselves poorly styled or unable to support complex formatting in the cells themselves.

Does your blog software support cell alignment, colspan, footers, etc?

Bonus points here for progressive enhancement to allow the user to change how the table is sorted or search within the table. And double bonus points here if the table is usable on mobile.

The ability to easily download the table as CSV/JSON/etc is also a luxury.

These are all areas where my site’s tables could improve.

This is the audio for this article (lol); Audio from Kokoro TTS (Apache 2.0)

Diagrams Most of the time, these are just images. But I’ve seen some blogs support automatically rendering Mermaid diagrams and other diagram markup languages.

This is a real treat to write, because it saves a step of converting to an image, embedding it, and keeping it up to date with the original diagram markup. Also, a lot of systems then don’t have anywhere to keep the markup. So you end up losing it and just having the image after a while.

My SSG doesn’t support this yet, but I’d like to add it some time soon.

Code & Math

For programmers, mathematicians, and scientists, there are some additional types of content other than text and media.

package main

import "fmt"

func main() {
    fmt.Printf("Hello World\n")
}

Code Highlighting really helps with the readability of source code. There are a lot of programming languages. So there’s a large surface area to support.

But there’s also a ton of great libraries out there for highlighting source code. So most CMS & SSG software do have support for this or can easily add a plugin to support it.

For a really really luscious experience, you can make your code runnable. The best example of this I’ve seen is Anton Zhiyanov’s blog.

Anton wrote his own sandbox to support running snippets (Codapi). But there are other options for this too both self-hosted, like Runno, and cloud-hosted, like Replit.

Most of the time, this is me when I’m asked to do any math. Seriously, if you can pass 3rd grade math, you can have a successful programming career.
Most of the time, this is me when I’m asked to do any math. Seriously, if you can pass 3rd grade math, you can have a successful programming career.

MathJax is also nice for typesetting math in an accessible way. MathJax.js is really easy to add to any site and can work without any specific integration to your CMS or SSG.

So if you use math at all in your blog, it’s really easy to add MathJax.js and call it a day.

But I try my best to make things without javascript. So, I have implemented this by embedding Katex.js in my SSG via an embedded javascript interpreter so that it is converted to HTML at build time.

The pre-rendered MathJax then looks like this inline example: abcd=adbc \begin{vmatrix} a & b \\ c & d \end{vmatrix} = ad - bc

Sometimes (as is the case above) this messes with the line height. So, it’s often better to include the math as a separate block:

{x+3y=6x+6y=5 \begin{cases} x + 3y = 6 \\ x + 6y = 5 \end{cases}

Read Time & Progress Bar

This is what you might look like after reading this whole post. ⚰️💀🪦 Generated with Stable Diffusion XL
This is what you might look like after reading this whole post. ⚰️💀🪦 Generated with Stable Diffusion XL

A lot of sites have an reading time estimate near the top of the article. This is even provided automatically by the reader view on some browsers.

I think the point of this is to give the reader an idea of how much of a commitment the article will be.

Most people can read about 250 words per minute. So this calculation is fairly easy to provide after stripping non-text content like code, figures, and tables.

But, I don’t really use them myself.

A similar idea to the read time estimate is a progress bar. This gives more interactive feedback and adds some gameification.

This is more of a gimmick I think. I don’t mind if it’s integrated well into the design and is unobtrusive. But, that’s fairly rare.

Organization Within a Post

For exceptionally long articles, you need some additional organization help.

Clickable Headings

Clickable Headings make it easy to share a specific section of the article. It brings you directly to the section you want to share.

Support for this is really hit and miss and I’m not sure why. It’s fairly easy to slugify the heading and add it as an id attribute.

The area where this gets harder is adding a clickable icon on hover. Usually, this is a pilcrow (¶), section symbol (§), a pound sign / hash symbol (#), or a link icon (🔗).

Hover over the section above for a demo. (I’m using ፨ from Ge’ez/Ethiopic script)

But, this requires including a separate anchor link element wrapping or following the header. So, the CMS or SSG has to explicitly support this and, for whatever reason, many don’t.

Table of Contents

Automatically generating the table of contents from your hierarchy of sections is awesome. But, the challenge for CMS & SSG systems is inserting them in the content.

Sometimes you can cheat this by having the theme insert the Table of Contents in a sidebar. But otherwise, it’s nice to have the ability to control where specifically in the article the table of contents appears (if at all).

Footnotes & Definitions

Footnotes are great for maintaining a nice flow, while still providing citations or extra context that would be too good to leave out. The key feature here is the ability to click to go to the footnote and back to the article.

An even better version would be to inject a popover so that the footnote appears if you hover over the footnote number. Wikipedia is a perfect example of this.

Wikipedia shows you a preview when hovering on a page link.
Wikipedia shows you a preview when hovering on a page link.

Meanwhile, definitions are also great for complex content, which often includes a lot of jargon and acronyms.

Definitions are the idea of hiding additional text behind a popup that shows when you hover over the word. This helps in 2 ways:

In HTML, this is often an abbr element like this:

<abbr title="The feeling of euphoria over supporting obscure web features in your SSG">
    Webnoveliria
</abbr>

Complex Layouts

Complex Layouts are more common in CMS systems than SSG’s. But they can be useful sometimes.

On the simple end, this includes things as simple as changing a paragraph’s alignment and float images. Another example is a set of fixed templates that you can choose from which control the overall layout.

But on the high end, there’s full blown “Page Builders” which promise the ability to make highly varied pages.

These are less useful for blog posts. But, sometimes it can be nice to have the ability to put in a column layout for showing some separate images side by side without having to combine them into one with GIMP, Photoshop, or some other tool.

Organization & Discover of Posts Overall

Index Pages

An example of a tag page, showing articles on my blog tagged #technology.
An example of a tag page, showing articles on my blog tagged #technology.

Index Pages help organize your content into list pages. The most common options include listing all posts in a year or month, by tag, or by author (for multi-author blogs).

For really large blogs, this necessitates pagination. That largely also depends on whether you choose to show just the title on the index pages or a description or the full article.

These index pages are also an opportunity to expand a bit on the category or author and provide a nice picture and some background information.

Featured/Popular Articles is an opportunity to jump-start readers to your best content. This is usually a section on your homepage.

If you’re anything like me, one or two articles far outweigh the others in terms of traffic. (see A Tour of Local AI in Early 2024)

So, you can highlight those star articles on your homepage to put your best foot forwards.

Similar Articles

Similar articles are a great way to keep readers engaged with your site. If they are really loving one of your articles, you can give them a list of similar content for them to check out, too.

Of course, you can manually configure this. But there’s also decent algorithms to automatically link these articles for you. And now that we’re in the age of LLM’s, this is a great application for finding similar content via vector embeddings.

Full Text Search also helps your readers find what they’re looking for. Of course the classing redirect to Google with site:yourdomain.com appended to the end still works.

But, having a search feature directly on your site is still nice for larger blogs. Most CMS’ offer this. But, it’s tougher on SSG systems without opting for a service like Algolia or hosting your own with an open source project like Typesense or MeiliSearch.

Some SSG’s offer search out of the box. But even if they don’t, it’s fairly easy to add it by indexing your content and build time and serving the index.

For smaller blogs, you can use ElasticLunr.js or another full-text search library. But, this only scales so far before the index becomes too large to reasonably serve on each request.

So, search is a real advantage of using a CMS over an SSG.

Social Features

RSS/Atom Feed

NetNewsWire is still great.
NetNewsWire is still great.

Google Reader shut down in 2013. But, like any good technology, RSS/Atom refuses to die. And, it’s a great way to allow your readers to subscribe to your content in a lightweight way.

Luckily, most CMS & SSG systems automatically expose an RSS/Atom feed for your blog. So, tons of blogs support it even if the author doesn’t realize it.

But if you are rolling-your-own or using software that needs to enable RSS/Atom, please setup a feed for your blog!

The thing to note here is that RSS/Atom feeds fit the role of “pull”-based notifications. Or, don’t call me, I’ll call you.

Since producing a feed is the same as an index page with slightly different markup, it’s dead simple to support.

And, it is a great way to reach a crowd that is less likely to signup for your newsletter, engage on social media, or respond to other push-based communications.

In fact, some people are very committed to this style of notifications. See “Kill the Newsletter” and other similar software. So, it’s nice to meet them where they’re at since it’s so easy to support.

PS: I wrote a whole post on finding good feeds. So, check that out if you’re like reading blogs & following individual creators.

Newsletter

Despite sometimes getting a bad rap for being a nag, newsletters work. At least, that was my experience when I used to do agency work and A/B testing.

Other than social media, there is probably no better way to convert a one-time visitor into a true subscriber.

The downside is that email is complex enough that you really have to pay to send in bulk. And, it can be expensive if you get past a small list. So, it is often out of reach for many personal blogs.

But for a company blog or if you are somehow making money off of your blog, a newsletter is really a must.

One small hack (that I do myself) is to run your own instance of ListMonk, which is an open source newsletter management system. It handles signups, double opt-in, unsubscribes, and composing your messages.

Even up to decent sized lists, it works great and saves a ton by allowing you to use lower-cost email services like AWS SES.

PS: As you might have been able to tell, I have a newsletter, too. Lol. You can sign up here.

Comments

Comments are high risk, high reward. Most blogs probably don’t have enough pull to have a healthy comment section. So, you’re probably better off outsourcing discussion to social media (see crosposting / POSSE)

Another downside is that comments require moderation. Obviously there’s spam, which is a massive threat since it will trash your domain’s reputation.

But if you can pull it off, comments are an incredible source of value. Often I find comments have better info and discussion than the article itself. So if you can keep that on your site, it fosters a great community and can help improve your content instead of competing with it.

CMS systems often have a comment system baked in. And there are 3rd party comment services like Disqus or self-hosted comment systems for static site generated blogs.

Capcha’s are required. And another friction point is creating an account, which a lot of comment systems require.

But instead, I like the idea of allowing anonymous comments, but requiring approval before showing up.

Crossposting / POSSE

Saying, “post your article to social media” seems almost too simple to qualify as a feature of a blog. But it’s worth mentioning for 2 reasons: POSSE and having a canonical place on social media for discussion.

First, POSSE stands for Publish (on your) Own Site, Syndicate Elsewhere. That means always publishing your content on your blog / site first and then copying it to other platforms.

One wrinkle is that different types of content deserve separate places on your site (blog posts, tweet-style messages, and link posts). So organizing that on your site takes some work.

But, linkblogs are rising in popularity.

Second: crosslinking. Obviously, post your stuff to social media. But beyond that, you should include the link on your site. This works especially well for places that try to centralize all discussion about an article like Hacker News and other forums.

By including that link on your site, it works kind of like a comment section. Your reader can quickly retweet you or comment on Hacker News.

Linkbacks & WebMention

The idea with Linkbacks is that when you link to someone’s site, your blog software automatically sends them an HTTP request notifying them and vice versa. That way, you (and they) can show a list of places your article has been mentioned.

Unfortunately, there are many competing standards for this (pingback, refback, trackback, etc). But, the most popular seems to be WebMention. Though even there are not many CMS platforms that support it. WordPress supports pinkback natively, but it’s opt-in and most people don’t enable it.

The situation is worse for SSG’s, because WebMention (and others) inherently are a dynamic feature; it requires a server component. So you’d have to setup a side-car service to handle this.

Generally, I don’t think there’s a lot of return on investment for this feature. But if you want to really dive in to the Indie Web community, it might be fun to implement if you are passionate about it.

Web Rings

In contrast to WebMention, web rings are a very easy to implement way to jump in to the Indie Web community. The idea here is to join a group of people who all include a link on your site to “neighboring” sites or posts in the ring.

Often the web ring will also include a list page showing to whole group. And these are an absolute gold mine if you find a great blog in a small niche.

Since the ring is less dynamic than WebMention/linkbacks, it’s easier to support. It can be as simple as a hardcoded list of whoever is to the left and right of you in the ring. But, it can be dynamically updating if you want.

My favorite example of this is Drew Devault, Simon Ser, and friends’ ring as shown at the bottom here.

Other Miscellaneous Features

How to Cite

For the academics out there, having a bibtex citation ready to copy paste helps your work get cited properly.

@misc{niaquintowhatmakesgoodblogsoftware,
      title={What Makes Good Blog Software}, 
      author={Nick Iaquinto},
      year={2025},
      month={1},
      url={https://niaquinto.com/blog/2025/02/what-makes-good-blog-software}, 
}

Good Print Styling

Maybe you want to print it out and mail it to your grandma. This often includes expanding links, hiding UI elements and replace any interactive content with a static representation.

Anti-Features

Popups, Banners, & Interstitials

For this, you really have to think about your goals. Most professionals, a blog is more about sharing knowledge and establishing yourself as an expert than the actual reach / visitor count you get.

In this case, engagement-bait is usually a bad idea because it skews your audience towards low-value engagement and less depth. As you follow the metrics, you will write shallower and shallower content, which undermines your reputation as an expert.

On the other hand, if you are selling courses, training, consulting, or anything else where you need a large reach to find customers, then this might be a good idea.

Breaking Browser Behavior

I’m looking at you here, Medium

Don’t mess with native browser behavior. This includes:

It’s bad for accessibility. But, it’s also just plain bad. Let people use their client the way they are comfortable.

Conclusion

Content is always first. But there’s a ton of features that can push your content from good to great. And part of the joy of having a blog is customizing it to suit your needs.

I hope this list serves as a nice reference for anyone thinking about what blog software to choose or wanting to write a static site generator.

Personally, I’m looking forward to adding “Similar Articles” and some social features (Linkbacks & Links to crossposts) to my blog.

Happy Blogging!

Want new articles in your email inbox?