About my blog
Posted on 2025-09-05 in Blog
After more than ten years, this is my 200th blog post! Well technically the French version is the 200th post and this one the 201st because of how Pelican counts them. I decided it would be a good time to take a look back and one ahead.
I started this blog in 2013 while I was still a student at Centrale Marseille, a French engineering school. At the time, it was built with Drupal and hosted on the school's servers.
I quickly decided to turn it into a static site to make it simpler and easier to host, and to migrate it to my own domain to be more independent (my graduation was approaching). Since I was already doing a lot of Python, I chose Pelican, a generator written in Python. From what I recall, I also looked at Jekyll, another very popular solution at the time written in Ruby. Today, I will also look at Hugo, a solution written in Go that seems to be growing a lot in popularity lately.
For this blog, I plan to stick with Pelican: it works very well, it's sufficient for my needs, and since I have few articles, the site is generated in less than a second. So I don't need Hugo's performance. In short, there's no good reason to change. Changing would even be difficult: my articles are written in reStructuredText and not in Markdown (more info on this below), which works with Python but less so with other markup languages.
The blog hasn't changed much: I continue to blog about tech topics that interest me. Some categories haven't had any recent posts and probably never will: they correspond to my interests when I started the blog. Only programming has really remained. With experience, I also feel like I have fewer topics that deserve an article. From this point of view, 2025 looks like it will be an exceptional year with lots of new articles.
My blog remains relatively unknown. This is mainly my fault, as I don't do much advertising because I'm not interested in it. I guess writing for myself is enough for me, and I prefer to clarify my ideas rather than be read. In the beginning, I posted links on Twitter to get a little visibility. Now I've left Twitter, where I wasn't active anyway. I have a Mastodon account, more to follow things than to post. And very few people follow me.
I still have anonymous, GDPR-compliant statistics without cookie banners. At first, I self-hosted a Matomo instance. To simplify my life and save time, I switched to Plausible this year: it's simple, sufficient for my needs, GDPR-compliant by default, and not very expensive (€9 per month, which I can afford now). My most viewed article year after year remains an article published in 2013 on creating a cover page in LaTeX with twice as many views as the next article. With almost the same number of views are an article on using trap in Bash and one on namespaces in Docker. Of the articles published this year, the one on uv and ruff and the one on Pydantic and enums are working very well.
The writing language also changed. Initially, I wrote everything in French, then I offered translations of my articles into English to increase their visibility. Since translating was very time-consuming, I now write in English, except for rare special articles like this one.
The hosting has also changed. I switched from a Drupal site to a static site hosted on my VPS to a static site stored in buckets (at Scaleway to avoid the American giants). It's even simpler (no more server) and works very well. It's also cheaper. I configured CSP via HTML, because I don't think you can configure these headers in buckets. I find it less good, but it works. I keep a VPS for other projects that need a server, including my comments, which remain self-hosted thanks to isso.
As for the source format, I'm still using reStructuredText. Pelican works with reSTtructuredText (via docutils, the reference implementation for this format) and Markdown by default. Personally, I've never been a fan of Markdown: I find it insufficiently specified and it has too many variants that aren't always compatible with each other. With reStructuredText, I can include files, have line numbers next to the code, etc. So I have more features that work properly and are properly standardized. It suits me better, even though I have to admit that the format lacks flexibility. I think that's the strength of Markdown: simple cases are handled correctly by everyone, and there's no hassle with indentation; you can write text any way you like and it works. I doubt that a markup language without this feature could ever become popular, even if parsing more complex cases or having all the features for your needs are harder.
And what about AI in all this? I don't really have an opinion. Since visibility has little impact, I'll continue blogging even if fewer people visit my blog. If it really becomes a concern and don’t want to feed the LLM, I think I'll continue writing, for myself, without publishing anything. That would be a shame, because I know some of my articles are useful. To be continued I guess…
To sum up: I'm very happy with this blog. It forces me to clarify my ideas, allows me to share some of my discoveries, and, I think, has made me a better developer. I plan to continue blogging when I feel like it on topics that interest me. I don't plan to change anything on the technical side: it works and I'm happy with it. The fact that the blog is static is a big advantage, I think, and I can only recommend that you also make a static site if you want a blog: everything is simpler, you can use git to manage articles, and there are plenty of good tools to make your job easier.
Note
On a bucket you cannot set the X-Frame-Options header (or any custom header) to prevent the inclusion of your website into an iframe. Using <meta http-equiv="X-Frame-Options" content="DENY"> will have no effect. Likewise the frame-src instruction of Content-Security-Policy will only have an effect if used if a meta tag unlike other directives. See X-Frame-Options header and Content-Security-Policy: frame-src directive.
Until headers can be set, I decided to use this JS code to hide the website if included in an iframe (at the condition JS is enabled for the visitor which nowadays should be most users):
if (window.parent !== window) { window.location.replace('about:blank'); }