Blogging industry is changing rapidly like any other field under the entire tech industry. Google plays a huge role in most blogger’s businesses and keeping up with new search algorithm updates can be a pain. Especially if you are not that tech savvy.

It was around 2019 when I played around with the idea of starting my own blog at some point on the side of my full-time work. I was researching the state of the industry and was looking at different options for building my blog with. As I had already come pretty far in my developer career I was also quite confident that I could build a very basic solution that could fulfil my blogging needs. After finishing my research I decided that I would not want attach myself to any specific platform that was already on the market and that I would like to build a very minimalistic and modern content management system for my own needs. The escalation mark was when I saw how slow and badly performing most of the WordPress websites were.

Starting off as another side project

I decided very early that my tech stack will be mostly based on JavaScript since that is my expertise. I decided to split my project into two parts, 1. being the “admin” interface to manage all the content and 2. being the end-user interface for exploring the content. Quite simple.

I also had been playing around with Google Cloud Platform in my work so I decided to leverage that as well for most of the background operations such as Authentication, Database, Storage, Hosting, Monitoring etc.

I began the process very slowly, mostly just by planning details every once in a while during evenings when I would have the energy to do so. I wanted to create a solution which would allow me to duplicate the solution and which would be reusable for any other future blogs as well.

I didn’t really have a clear vision of what I would even write to the blog once I would finish it but I always enjoy the process itself when building a new solution.

When coding the new platform I wanted to focus on maintainability of the code, since I knew I would have some time periods when I would not work on the project at all and it would be easy to continue where I had left off.

From the end-user’s perspective my main goal was to create a very minimalistic, no code-bloat solution that would get a perfect score in each of the Google Lighthouse’s ranking factors.

Optimizing content for page speed

One of the goals of building my own content management system was to built it in a way that everything would be sound in the PageSpeed Insights report. Currently getting the perfect score for all articles.

Focusing on technical SEO

As a bad marketer and as someone who doesn’t like to spend too much time in social media I wanted to create a solution that could market itself basically.

This was made possible by creating a solution that would be well optimised for search engines and that would create technically good content in the eyes of the search engines.

Creating technically sound solution is still a work in progress and most likely will always be as the search engines keep improving and changing their ranking systems.

Most fundamental aspects for a technically sound article page are performance, accessibility and technical markup.

So far I have been able to keep my solution to get the perfect score of 100/100 for PageSpeed Insights, which shows in the way that my articles are ranking.

Creating content and on-page SEO

Being someone who is totally new to blogging and SEO, I still am learning how to create content in a way that ranks well in search engines.

My number one priority when starting to write my own content was to publish posts which I like to write. It doesn’t mean I should ignore SEO side of things completely, but learning that good content should rank well by itself is still in my mind when writing content.

My writing process is usually the following.

Find a topic to write about

This is usually the driving force when I want to write a blogpost. I have to have the motivation to create unique and quality content that is not driven by just simply creating something for the search engines.

I usually pick something that I have first hand experience about or something I generally find very interesting to myself.

Do a little bit of research

When I have a topic in mind I usually do very small research around that topic in search engines. I try to see if this topic is covered well already and try to find some key aspects to think about in my own writing.

I also try to see if there are some high level keywords I should be covering for the topic I want to write about.

Start drafting the blogpost

When I have my topic and research done it is time to jump into the text editor. I never use my own CMS or any CMS for that matter for writing my content. I always write my blogpost first in some cloud based solution like Google Docs or Pages etc. I also make sure to keep my local copies of my posts in an external hard drive.

When I start writing, I always start with writing down all the headings. H1, h2 and h3 headings with possible some variations of the keywords I had researched before writing.

I then continue by writing the opening description and the first two paragraphs of the article by making sure those include the main takeaways from the blogpost.

After this is done, I try to just be myself and write naturally without thinking too much about SEO stuff or anything else. Just natural writing.

Finalising the content and publishing

When I am done writing my post in my local text editor it is time to copy everything to my own CMS.

I optimise all the media files like images for the post and upload them to my CMS.

I get all the links and other sources I am going to include for the blogpost.

Then I just get everything transferred to the CMS and publish the article.

Building the admin panel

When I first started building my own CMS I knew that I couldn’t really fix the vendor lock issue with my own solution either so I would anyway store all my writing content in my own drives and cloud solutions.

I wanted to build the publishing console as simple as possible so that I could just copy paste and construct all blogpost as easily as possible.

Custom content management system

At the time of writing this post, this is currently the view I have built for the admin panel dashboard. There is user management, media manager, post manager, link manager, subscriber list, profile manager and site settings.

User management

I had to build a very basic authentication system to be able to log in to the admin panel. I created a very basic OAuth solution with some custom roles to support multiple users on the system.

I currently have two types of roles for users: admin, and editor. This has worked so far as I have already used this CMS solution for a friend of mine who is simply the editor and I am the admin.

Media manager

I built a very basic media manger for uploading and updating media files such as images. All media files are uploaded to the CMS before they can be added to blog posts.

Post manager

Very basic interface for publishing and editing posts, as well as creating categories.

Posts are saved to a NoSQL database as JSON objects.

Link manager was my latest addition to the platform after experiencing first hand how painful it is to keep track of all the links that are embedded into all posts.

Subscriber manager

I also built a very basic subscriber manager to manage all emails that have been gathered from the end-user interface, but since discovering Substack, I have disabled this functionality mostly because there is less overhead when I am not responsible for handling peoples emails in my databases.

Profile manager

Admins and editors can update their own profile data which is displayed in all posts they have published. Very basic like image, name, email type of stuff.

Site configurations

These are site wide key-value pairs which affect how the site behaves. This includes things like social media links displayed in the footer, site language, site name, site title, site description, some third-party integration API keys like analytics, AdSense, Disqus and so on.

That is pretty much everything that can be managed from the admin panel itself. Everything is very dynamic in a sense that it is easy to bootstrap the whole system time and time again and get everything running quite quickly and quite smoothly to setup a new blog from scratch.

My own static site generator

When everything is managed from the admin panel side and stored to a database then there is also a need for the frontend side for all the blog visitors and end-users.

There isn’t much magic happening here either. A quite minimal Node.js express server with a bunch of routes that read paths and try to generate the corresponding content for the visitors.

I have split everything into dynamic factory functions to keep everything nice and tidy so it is easy to update all my blogs running the system from one place. So no duplicate code and very dynamic and minimal infrastructure.

Goals of this side project

I have been building this project for almost two years now. This has been my longest side project so far and I still like to keep improving it.

There comes periods of time where I don’t work on it at all and let everything run by itself. Then comes times where I am more active and try to see what is happening in the SEO field, are there any outdated libraries I need to keep updating and things like that.

I think what makes this project so long-lasting so far is that I have my wife and a friend already invested into it by them actually using it. Myself also included.

I love improving the system by itself and also using it myself. If there are things I think I would need to make my blogging easier, then I simply come up with the solution and build it.

It is possible that I will be considering to making this into a commercial product if I have the time and energy to do so and if there is a market fit for a product like this.

In the meanwhile I will just keep this as a very nice side project to work on, making it better and more dynamic overtime.

Coding my own content management system

Building my own content management system has been the most interesting side project I have had so far. I find it exciting to keep improving the UX for the visitors of the website, to keep making it easier for myself to publish content through the admin panel as well as to make everything work well SEO wise. Multi-dimensional project.