Years
2025 ~
Status
Type
Web application
Technologies and tools used
Platform
Custom-built hosting platform in my home lab
This is my personal website. I've had several versions running for the last 20 years, and this is the latest incarnation. I wanted something built by myself, where I can implement the functionality I wanted, without having to adapt to whatever plugins are available in other third-party solutions.
For many years by personal website was a Wordpress deployment, but I never really liked it. I stopped updating it around 2017.
In early 2025 (February, if I remember correctly) I started working on a new version, and it's now ready in early August 2025.
Instead of using another Wordpress or some other content management system, I built everything from scratch. Sure, it took much longer, and the result isn't as polished as if I used some well-known software, but I feel happier when I build my own stuff, just like people who love cars enjoy building their own machine even when it takes them years and ends up costing more than what they would have paid for an off-the-shelf model.
Part of the reason why I wanted to build it from zero was to catch up with the current status of HTML, CSS and JavaScript, because these technologies have been evolving a lot since I initially learnt them many, many years ago. I also got a good refresher on Python, especially dataclasses, and also responsive design, because I wanted the site's design to adapt to small screens such as the ones in cell phones.
At the moment of this writing (August 7th, 2025) I'm still polishing little issues with the HTML/CSS layout and fixing bugs, and little by little importing content from my old sites into this one.
The application is built around stateless Docker containers running as a replicated Docker Swarm service. These containers are rebuilt and redeployed automatically using a CI/CD workflow in GitHub Actions.
All the data is stored in a MongoDB database, also running on the Docker swarm. HTTP session storage is handled by Redis.
In order to increase performance and minimize calls to the database, the stateless containers have a local filesystem cache where they save static content such as images and file downloads. Only the first request goes to the database, and every request for the same image or file after that is served from the cache.
Since it's hosted in my private network at home, there's also reverse proxy (running as a Swarm service too), that forwards traffic from the Internet to the appropriate service. This server also does some aggressive caching of static content, such as CSS, JavaScript, and images.
There's a very simple, but functional, web administration backend for me to add and manage content, such as articles, blog posts, projects or photo galleries.