I have been running this website since 2014. Since then, a lot has changed. My repository shows over 3000 commits and that's just the changes after I migrated to a static website.
This website was started in 2014, when I was 14. The first post was still in Portuguese and that’s where I said my “Hello, World” in a Portuguese fashion. For quite some time, I had different blogs and then I ended up merging everything under my main domain, which, at the time, was henriquedias.com.
I kept writing in Portuguese until the beginning of 2015. Then, I aimed for something more: to write in English. As a 15 year old, I felt the urge to develop my English skills and I thought having a blog would help. In retrospective, I am pretty sure it did!
Some more years passed, and now we’re here, at hacdias.com. The old domain still exists, I still have it, and it merely redirects here. Since 2014, this website suffered, at least, 16 complete redesigns. For the future, I will try holding off more redesigns. I’m not yet 100% happy with the current design, which I have since September 2020.
💡 Why does this website exist?
Everyone that creates content does so for some reason and I am no exception, of course. I honestly don’t remember the reason why I created the website in the first place, but I can tell you the reasons that lead me to keep it nowadays.
Personality: I want this website to show who I am, what I am doing and what I like. Nowadays, most websites are very plain and look the same. This is my corner, and I’m trying to make it pleasant and, at the same time, unique.
Knowledge: doubtfully the reason why I started this website. However, one of the main goals for me is to share my opinions and possibly help anyone along the way. By writing, I also learn. It is a method of consolidating existing knowledge.
Photography: I love photography and taking pictures with my camera. I am not a big fan of social media apps such as Instagram because I can’t chose to have a layout as I wish. I might get less “views” here, but what matters is the content and that it can be presented and customized how I want.
Less social media: almost everyone uses social media. Despite being useful, they are also locked silos where you store your data. The data you create. The data you should own. Using my website as the medium to share whatever I want to share in first hand allows me to own my data a little bit more.
⚙️ How does this website work?
Over the time, this website has suffered imense changes. Sometimes I think how crazy it feels to have a website for over 6 years already and I’m just 21. I guess that is one of the perks of being born in this age. I wonder what the future generations will have.
This website is, for the most part, static. That is not a lie. The website is statically generated by Hugo, which is a super fast static website generator made in Go. However, don’t think it was always like that. When I started this website, I had an installation of WordPress in a shared web hosting provider in Portugal. In 2015, I had an epiphany and moved everything out of WordPress and never went back.
Regarding storage, it is a bit more complicated than it seems. This website is directly served from a VPS I have with Hetzner and it goes through Cloudflare for caching. That is the main entry point of this website. In addition, it is also stored in the IPFS network.
IPFS is a peer-to-peer hypermedia protocol whose goal is to eventually replace HTTP. For browsers equipped with IPFS capabilities, this website will be directly served from the network instead of hitting my server. In the past, I wrote about the publishing workflow on the IPFS network.
Not everything is stored in my VPS and/or IPFS. All my media content (photos, videos, etc) is served from a subdomain
cdn.hacdias.com which is linked to a Bunny edge storage box. Bunny is yet another CDN, just like Cloudflare. However, they also provide the possibility of having a storage box where you can directly store files that are then served by their CDN.
For many times, I wondered whether or not I should use a full blown CMS - Content Management System -, like WordPress to manage my website. Every time I came to the same conclusion: not worth it. Instead, I created a wrapper “CMS” around my website that modifies my Hugo source files: Eagle.
Eagle is a little piece of software I wrote in Go and it is a simple wrapper around the static files produced by Hugo. Among others, here are some of the main features:
Dashboard: I have a dashboard where I can create, edit and delete posts. In addition, it is also possible to perform some other maintenance tasks such as synchronizing the git repository.
Git synchronizer: every time I update the website manually on my computer and commit it to git, it gets automatically updated.
Search: I provide a full-text search endpoint, which I go into more detail on the next section.
I am considering removing the ActivityPub support from my website. Right now, my website is able to provide posts formatted as ActivityPub entries; post to my followers when I write new content; and receive comments via ActivityPub.
What bothers me is that the logic is a bit flaky and it fails quite often. Besides, I only have 2 followers and one of them is a testing account of mine. Removing it would cleanup the code and possibly not hurt anyone.
🍇 The features
Nowadays, this website provides more features than ever before. Even though it is technically static, it is updated quite frequently with data from multiple services I use to track movies, TV shows, songs I listen to, books I read, etc.
As I said before, my website feds from data from some other services I use to keep track of certain things. Now you may ask me “but wasn’t the point to own your own data? why are you using external services?”. Well, my reply to that is that those external services work very well and are very convenient.
I wrote a bunch of scripts that collect data from a few silos daily and updates the website:
📚 GoodReads provides information for my reading page so I can keep track of the books I’ve read in the past and that I am currently reading. However, I have been considering lately to ditch GoodReads completely and replace it by a “home baked” alternative where I just keep track of my readings in this website.
📺 Trakt feeds into my watches page, which contains the series and movies I watched. Currently, I don’t keep track of each episode on my website and I keep it simple by stating the last time I watched each series or movie.
🎧 Last.fm is for music and it is synchronized to my Spotify account. However, in contrary to what happens with Spotify, the stats from Last.fm seem to be much more accurate. I feed its data into my listens page which has the current top artists and tracks I’ve been listening to. It’s probably the “worse” looking page from the bunch.
🙍 Miniflux is a simple RSS reader that I self-host. It has a really neat API and I use to track down my blogroll, which can be found in the links page. I believe it is important to let others know we follow them and to share that with the blogosphere.
This website supports Webmentions. Webmention is simply a web standard that allows for interactions and conversations across the Internet. They can be in the form of a comment, a like, a repost or some other interactions and they’re a key component in the decentralized web.
When you visit one of my posts, you’ll be able to see on the bottom a box where interactions should be. Right now, I’m not handling the Webmentions completely by myself. I rely on three main external services:
- Webmention.io for receiving webmentions. This service already parses the webmention and streamlines the format that “arrives” at my server.
- Bridgy for creating webmention for Twitter likes, replies and reposts.
- Telegraf for sending webmentions without having to deal with all the issues that any decentralized system might have when one machine goes offline for a bit.
All pages that list posts, such as micro and articles, have three feeds attached to them: HTML (Microformats), JSON and an RSS feed. If you want to follow all my posts, you can use the feed at the “all” page. If you feed your RSS reader the page URL, it should be able to automatically detect the feed locations.
In case your feed does not detect the feeds automatically, or if you need to access for any other reason, the links are formatted as follows. This example is for the “all” page:
One very important feature, personally, is the search feature. Right now, the search feature is available through the search page only. However, in the future, I want to be able to search from any point of the website.
The search is not static. I am self-hosting an instance of MeiliSearch, an open-source and super fast search engine. It is very fast to index, very quick to search and allows for full-text search.