It’s been over 4 years since my first post on this blog.

During those 4 years I’ve written over 90 posts, received over 1 million clicks, a dozen legitimate reader e-mails and thousands of spam e-mails.

And I love it!

I’ve found that writing can be very fulfilling and I encourage you to at least give it a try.

This post covers the reasons why I write, how I write and some tips on how you can get started writing one yourself.

Blogging is so 2004 2024.

Why I write

I’m a software developer by trade. However, some might find it surprising that I actually write very little code in my free time.

My GitHub activity.
My GitHub activity.

Instead, I play around with computer hardware, self-host some services on my machines, and make stupid experiments that often result in interesting findings.

Most of that work had been invisible, until I started writing about them on my blog.

I write because other people find my posts useful. I’ve learned that some of my posts have been really useful to people who’ve faced similar problems in the past or who want to learn more about a relatively obscure piece of hardware. Tools like Marginalia search, Google Search Console and goaccess have been great sources for finding where my content has been referenced.

I’ve found my content linked in all sorts of places:

Seeing my work out there helping people gives me an immense sense of accomplishment and motivates me to write about the challenges I face. It really does mean a lot to me. It’s not quite on the level of Jeff Geerling and the work that he has published, but perhaps I’ll get there one day.

People on Reddit finding my archival efforts to be useful. I love to see this!
People on Reddit finding my archival efforts to be useful. I love to see this!

I also often end up looking up my own posts because of some technical details that I’ve written down, or to share a post in a discussion because of its relevance. The one about the minimum viable fan control script has been very handy, for example.

This post has been performing well consistently for years!
This post has been performing well consistently for years!

Quite often I end up finding solutions in other indie blogs myself. There’s something special and authentic about those, and they often go more in-depth than places like StackOverflow. Ads and inappropriate sponsorships are also rare on those.

I write because I forget things. My blog serves as a public diary of sorts, and it has been extremely helpful in reminding me about all the fun things I’ve worked on, or experiences I’ve had. I sometimes revisit my older posts and I still find it surprising how much I’ve managed to do, or what I’ve worked on.

I write because I can do what I want.

No Synergy Greg.

No managers.

No meetings.

No quarterly plannings.

No unpleasant colleagues.

No conflicts.

It’s really nice.

Rules of engagement

Whenever I write something, I try to follow a set of principles. These have been influenced by my own ideological views and content creators that I look up to.

Write content that I would like to read myself. I love stumbling upon well-written posts covering topics that the author is passionate about. These posts have a special energy in them, which is very infectious and motivates me to put more effort into my own writing.

If you want to know what I like to read, then check out the list of good posts here, and anything else that’s cool goes here and here.

Straight to the point. I try to avoid unnecessary word salad whenever possible and try to get my point across in a clear and concise way.

Make the content accessible. The person reading my blog might be a seasoned developer, or someone just starting out in IT. It’s a balancing act and I’m unlikely to ever get it just right, but I try to remind myself of what I knew back when I was just starting out and try to address that person in my writing.

Listen to the audience. If the readers demand to see the cute cats you mentioned in a post, then you better deliver.

Keep performance in mind. I do my best to keep the page size down to a reasonable size. This results in my own bandwidth requirements being lower, allowing me to serve more traffic over the same connection. It is also helpful to readers who are on a slower network connection or are running slower hardware.

The Performance Inequality Gap series has inspired me a lot in this area. I’m not going to do every micro-optimization that tools like Lighthouse complain about, but I will do what I consider reasonable.

No ads. A couple of dollars a month is not worth compromising the privacy of my readers. Relevant and up-front collaborations with manufacturers in the style of Level1Techs and Jeff Geerling are still OK in my view.

No shady sponsors. Most sponsorship offers that I get involve gambling, and gambling but with extra steps (crypto-“currencies”). Anyone working in an area that exploits human psychology to make obscene amounts of money (at the cost of ruining actual human lives) should really reconsider their life choices.

No so-called “guest posts” or backlinks. I have received hundreds of these SEO spam e-mails at this point, and the pattern is the same:

hey ounapuu.ee, we really love your site about $NOT_WHAT_I_ACTUALLY_WRITE_ABOUT

are you ok with linking to $SHADY_SITE or a guest post? what’s your asking price?

Latifi Hamilton, SEO Spam Corp. Ltd

I am 100% convinced that SEO optimization in this form is an absolutely useless “job” and a net negative to the world. Please stop.

No generative AI garbage. It conflicts with the reasons why I write a blog in the first place. I’ve tried things like GPT-3 to see what it regurgitates, and it has been the most unoriginal, fluffy drivel that gets all the important details wrong.

I’ve also seen the same-looking generative AI imagery in lots of blog posts and presentations, it’s really off-putting and shows a lack of care and effort by the author, even if the rest of the content is solid.

Getting started

So you’ve finally decided to start your own blog. Great! Here are the steps that I believe make sense to someone just starting up.

Why are you writing?

This is the most important step. Don’t skip this.

A lot of techy people (myself included) get carried away with the technical details before writing the first post. It’s understandable, the technology aspect can be very exciting on its own. However, focusing on the blog setup itself distracts from the core of your blog: the content.

Start by figuring out the reasons why you want to write in the first place.

It could be anything:

  • you have a fun hobby that deserves more coverage
  • you find that there are products in your niche that don’t have any proper reviews
  • you want to share some stories and lessons learned from your professional career
  • you want to create content on a platform that you have full control over
  • you just want to share your work with the world

Now that you’ve got that figured out, I recommend writing up your first draft, even before you know where you’re going to host it. Any plain-text file will be fine for this purpose, and you’ll most definitely rewrite most of it and touch it up once you know where you’re going to host your blog anyway.

Find a place to host your blog

You have your goals in place and you have the draft for your first post. Great!

There are a lot of options out there for hosting your blog, each with their own strengths and weaknesses. You should pick the option that fits your needs the best.

Indie blogging platforms

Examples: Mataroa, Bear Blog

These come in all sorts of flavours and offer different functionalities for free or a small nominal fee. Usually run by one or more people as a passion project or side-gig. Easy to start out with, and the good ones offer easy ways to take your posts with you if you ever decide to move to another platform.

If I didn’t already host my blog on my own server, then I’d probably use one of these types of services.

Fun fact: Bear Blog is run by another Herman!

Big blogging platforms

Examples: Medium, Substack.

Quite popular and likely have good tooling for writing content easily, but you usually have less control over your work and you are at the whims of the platform. If they ever decide to completely change their business model and start charging you much higher prices for hosting your work there, then you better hope that they have an easy way to export your content.

Dynamic site generators

Examples: WordPress, Drupal, Joomla

You can host these on your own server, or pay someone else to do the hosting for you. Can be easily customized and should be quite beginner-friendly for content creation. Pages are created on the fly, so these are often not the most performant option. Can easily fall over under high traffic if the setup is not optimized and your post gets linked on a popular platform (“hug of death”).

If you ever have to pick one of these types of services, then you must make sure to keep it up to date. WordPress vulnerabilities can be exploited within hours after a vulnerability disclosure.

The performance and security considerations are the main reason why I avoid these options.

Static site generators

Examples: Hugo, Jekyll and many, many more

With static site generators, you build the site once and copy the contents to your web server. This comes with great performance benefits as serving static files on a web server is really darn fast. Even the cheapest virtual private server at any cloud provider can likely handle more than a gigabit of SSL-encrypted traffic with this option.1

Security is also less of an issue. As long as your web server is up to date, then you don’t have much to worry about, just make sure to not accidentally push any sensitive files and information along with your blog.

These benefits come with a few trade-offs. The content is written in Markdown and while you can embed code examples and images, it’s not as user-friendly as other platforms. Adding dynamic content and comment sections is not included by default.

This is the option I’ve chosen. The site is built with Hugo, the web server part is handled by Fedora Server, Docker and this container.

It’s also possible to host your static site on GitHub, if you don’t want to deal with the hassle of having a web server around. The downside of this approach is that GitHub is quite often down, and their downtime is now your downtime.

Just do it.

Go ahead, write that first post! Here’s mine for reference, not great, not terrible.

Don’t worry, even I started a blog and abandoned it on my first attempt.

Sometimes I start writing when I don’t feel like it. If there’s a 20 minute time window, I can write the skeleton for a new post, or finalize a work-in-progress one. Once I get past the hurdle of starting, I’m in the zone. Some of my best posts have been written under these conditions.

Daniel Stenberg had a talk at FOSDEM 2024 that incidentally covered similar time management techniques that help him get work done on curl, I highly recommend giving it a listen.

Build a habit

I have a goal to write at least two posts per month and I’ve mostly stuck to it, with a few exceptions. Internal deadlines help me actually get my thoughts and work out there in a somewhat timely manner.

Having this cadence also helps in situation where I expect a busy schedule, as I can try to finish a few posts in advance.

A post can take anywhere from 1 to 4 hours in my experience. Some can take a few days, such as my FOSDEM 2024 post.

One post per month can be a good goal for a first time writer.

Tooling

You don’t need anything special for writing. Use whatever works for you. If it supports spell-check, then that’s even better.

I write my posts in Markdown and the best tool I’ve found for that happens to be IntelliJ IDEA. I already use it for development work and its Markdown support is good. That’s it.

I’ve used tools like MarkText but it went really poorly the last time. Other text editors haven’t worked for me for various reasons.

Optional: buy a domain name

You may want to get a domain name for your blog. Depending on your setup, it can make transferring your blog to a different provider or service much easier, simply point your domain to a new IP address!

This does add a yearly cost that might not be acceptable for everyone.

Optional: use a completely separate contact e-mail

If you add a contact e-mail to your blog, then you will get spam, guaranteed.

I use a completely different e-mail because of this, it helps me easily see where the spammers got my e-mail. I also find it funny that every time a spammer e-mails me, they’re blatantly lying without even trying. You see, my e-mail is ihavesomethoughtsonyourblog@ounapuu.ee and it’s rarely the case that they actually have thoughts on my blog.

If you have a domain name and a decent e-mail service provider, then adding additional e-mails should be quite easy.

Optional: self-host at home

A small blog is a great first-time project for someone that wants to get into self-hosting and building a homelab.

All you need are ways to open port 80 and 443 for HTTP and HTTPS.

A residential connection will likely have a dynamic IP address. It might be possible to pay extra to have a static IP address. It’s also possible to sign up with a dynamic DNS provider that handle IP address changes for you.

I’ve gone one step further and written a DNS updater Python script against my domain registrar. If you can read this text, then it means that the script works!

How I write

I’m not going to tell you how to write because I can barely manage to do it myself, and there are smarter people out there from whom you can learn that.

What I can do is to share my writing process in the hopes that there are a few tech tips that you find useful.

Writing

I have a list of ideas that I have written down. When I get the opportunity or inspiration to write, I look at the list and pick something from it.

Every post starts with a draft title and a bulleted list of points to cover in a post. That list is like a table of contents for the post, and then I start expanding on them in writing.

Pictures are usually added after the first draft is done.

Sharing my work

I believe in POSSE: Publish (on your) Own Site, Syndicate Elsewhere. I have full control over my blog and can link to it on all sorts of platforms. Screw “big tech”!

Sharing my work has been tricky, however. I can always share it in platforms like LinkedIn, but links like that get down ranked compared to “native” posts on the platform itself.

Link aggregators, such as Hacker News and Reddit, discourage or forbid sharing your own content. I have done it, but only with content that I think is relevant to the communities. There’s a reason these rules are in place, simply check the newest posts on Hacker News to understand why.

I don’t recommend this type of behaviour, but if you have a good understanding of the community and what content they like to see, then it can be a good way to get some eyes on your content.

Once you get a following, you don’t have to worry much about sharing your work as your readers will probably do it for you.

How readers keep up with my blog

I’ve seen two ways that readers follow blogs: mailing lists and RSS feeds.

Readers can follow my blog using the RSS feed. For those that are unfamiliar with RSS, I link to aboutfeeds.com at the bottom of my posts.

It’s harder to track the number of subscribers with an RSS feed, but I believe it’s the approach that best preserves reader privacy.

Some feed reader services, such as Feedly, Inoreader and Feedbin, have a neat little feature where they actually send the number of subscribers in the user agent when making a request towards your RSS feed, and that user agent is visible in your web server logs:

127.0.0.1 - - [21/Aug/2024:10:40:19 +0300] "GET /index.xml HTTP/1.1" 304 0 "-" "Feedly/1.0 (+http://www.feedly.com/fetcher.html; 72 subscribers; )"

Mailing lists are also quite common for blogs, but I never found a good mailing list provider that costs a reasonable amount of money, so I never started one. I’m also not going to manually maintain one or build a solution myself.

Analytics

My main analytics tool is goaccess, a handy terminal UI tool that reads nginx web server logs and outputs basic statistics. This is just enough information for getting a basic understanding about how well my posts are doing.

goaccess can also track incoming requests live, which is very cool to observe when your post has gained traction on Hacker News.

Small glimpse of what goaccess can show.
Small glimpse of what goaccess can show.

I also check in on Google Search Console from time to time. It’s been quite handy for understanding how well my posts are doing in Google Search.

Example of Google Search Console results.
Example of Google Search Console results.

I can also get an understanding how my content is doing elsewhere. I don’t have Google Analytics on my page, but I can still see when my posts have gained traction on Hacker News or elsewhere.

I guess they track popular HN posts.
I guess they track popular HN posts.

Observations and tech tips

My years of running a blog have resulted in some potentially interesting tidbits and tips that I can share.

Hacker News

Hacker News likes cats, cool hardware, tech museums and FOSDEM.

And they sure love old ThinkPads, including those that act like a server. Any old ThinkPad, really.

I’m happy with it because the discussions that spawn from these topics are great to read and I learn new things almost every time. Sometimes people post comments without reading the post and that kind of pisses me off, but overall it’s a nice community that has done a decent job moderating itself.

What I also like about Hacker News is that they also have a second chance pool. If your submission was great but didn’t get much traction initially, then it might end up being given a second chance to get to the front page. Two of my submissions have gone through this process, it’s a really nice feeling to be acknowledged like that.

People like hardware

I’ve noticed that no matter what hardware I talk about, there is someone out there interested in it.

For example, most clicks coming in from Google are related to products like Fairphone 5 and Zimaboard.

Screenshot taken in Firefox Private mode. It's beating The Verge!
Screenshot taken in Firefox Private mode. It's beating The Verge!

Niche products, such as ExpressCard to NVMe adapters, are also bringing in a solid number of clicks.

Screenshot taken in Firefox Private mode.
Screenshot taken in Firefox Private mode.

I wouldn’t want to be a full-time reviewer like how most tech YouTubers operate, but it could be fun to get access to cool hardware that I could then do incredibly dumb things with test.

Feedback

You’ll probably get feedback.

Most of it will be good, constructive and informative.

Some of it will be from people who are complete tools.

The most important step is to figure out which bucket the feedback falls into.

You don’t have to address any of the feedback. You don’t owe anyone anything. It’s your blog.

If you’re brave, you can consider showcasing uninformed takes on your blog, in the style of Ludicity.

Follow your own blog

I use Miniflux as my feed reader because it’s simply the best one out there.

Counterintuitively, I also follow my own blog there as it helps me catch any issues with my RSS feed.

I’ve caught a few issues, such as my drafts being accidentally published, or new pages on my site being present in the RSS feed.

It’s also just a good way to see if the feed is OK.

Other blogs that I like

I follow a lot of blogs, but the ones that have had the biggest influence on my own blog are the following:

  • Jeff Geerling
    • he covers a lot of cool single board computers and actually uses Ansible correctly!
    • he also has an accompanying YouTube channel
  • Low-tech Magazine
  • Louwrentius
    • lovely little blog that covers all sorts of homelab-ish topics
    • this one is also solar-powered!
  • Ludicity
    • the aggressive tone is refreshing and gives me courage to say what I actually think
    • the blogging platform itself is also very opinionated and minimal, which I love to see!

Discovering new blogs

Sometimes I am bored. Happens rarely, but when it does, I like to look around to see what other blogs are out there.

I’ve used the following tools to find new blogs:

It requires intent and time to go through these, but that’s also part of the fun. Similar to a dedicated music discovery and active listening session, if you think about it.

Closing thoughts

I find writing to be incredibly fulfilling, and I hope that at least some of you end up writing about the topics that you are passionate about.

If you feel that there’s a topic that I didn’t cover, or you have additional questions related to writing a blog, then don’t be afraid to reach out to me!


  1. the cheapest ARM-based VM at Hetzner Cloud could easily serve 1.6 Gbit/s of HTTPS traffic, benchmarked using wrk against my own blog. ↩︎