A New Home for My Website

I decided to move domains, hosting and tech for my personal website, or: how I discovered I sometimes like my training wheels.

Lots of news about this website you’re visiting.

My previous 2021 website redesign was targeted at making me appear professional and focus on my skills in web development. As such, I went for a very technical and reduced look.

Website screenshot, maslov.io 2021 website

At the same time, it was a departure in terms of the technology behind it. For the first time, I tried static site generators and was immediately enamored with them. They reminded me of my humble beginnings in creating websites and starting out as a freelancer. I love the simplicity behind the jamstack - especially coming from a custom node.js-based server with EJS for templating behind my personal site at the time.

Having checked out multiple static site generators back in 2021, Astro among them, I went with Eleventy. Both still needed some time to mature, but Eleventy appeared to be further along. And both turned out to be venerable alternatives in the space.

Moving to Astro

Since then, I’ve built multiple websites with Astro - the secret industries website among them. And I liked the experience of building and maintaining so much that I decided to rebuild the new website with Astro instead of Eleventy.

Notice the lack of blog posts in the last years? That’s mostly a result of me concocting an Eleventy setup that was too fragile, complicated and suffering from a bad editing experience as a result. The JavaScript ecosystem and Eleventy have come quite a ways since then, making TypeScript and bundling easier and more ubiquitous than ever with tools like Vite and the developer experience has gotten radically better, even if more complex in many respects.

So this definitely isn’t a knock against Eleventy. It’s more of a knock against my poor choice of templating engine to use with Eleventy (EJS), which was made in a different time and with different priorities in mind. And a knock against me not walking the walk and fixing it.

Even though Astro railroads by being pretty opinionated about how you build websites with it, it rewards with quality tooling. And it turned out that that is exactly what I wanted for my website.

I want it to be easy to edit and add new content to, so it takes less of what little free time I have. Astro nudges here and there in certain directions (by that I mean architectural decisions, recommendations for tools that work best with it, and the breakneck speed at which its community formed and produced integrations) that make the experience as a whole feel almost magical.

Moving to Cloudflare

I’m currently hosting several small-scale projects via Netlify, like the secret industries website, a couple of landing pages for previous clients and Russian Doll’s Booking frontend. But my starry-eyes-ness about CDN hosting has been waning ever since Netlify sent out a $104,500 bill to a user on their free Starter plan.

Netlify since then apologized and, after some community pressure, will introduce some spending management features (unreleased yet at the time of writing). While I understand that their policy - to not let anyone hanging through the hardest of times and dutifully serving every last request - can be seen as admirable, this is not something I require for non-commercial or non-crucial websites, like my own personal website. Likewise, I don’t think that the handling of the situation was adequate given how Netlify first reduced that huge bill to 20% and then 5% of the initial sum before the user complained publicly.

My previous website, even though it was also a static site, was hosted on a VPS on Vultr in Frankfurt, because that’s where the one before that one was and I had a couple of other things running on it. But now came the time to move my personal website to one of these hosts as well, and my decision fell on Cloudflare.

The main reason was traffic cost. All providers tout transparent and predictable pricing, but egress cost is by its very nature unpredictable. You can’t know exactly how much traffic there will be. Here’s a comparison of egress traffic costs for some hosting providers I considered:

ProviderFree quotaAfter thatPer TiB
Azure Static Web App 100GB1 $0.00 $0.00
Cloudflare "Unlimited"2, 3 $0.00 $0.00
OVH Depends on region, "Unlimited"2 or at least 1TB at full speed5 $0.00 $0.00
surge.sh "Unlimited"2, 4 $0.00 $0.00
UpCloud Pooled between VPS, at least 1TB at full speed5 $0.00 – $0.011/GB $0.00 – $11.26
Hetzner Depends on region, at least 20TB or 1TB $1.12 – $8.26/TB $1.15 – $8.46
Linode Pooled between VPS, at least 1TB $0.005 – $0.015/GB $5.12 – $15.36
DigitalOcean Pooled between VPS, at least 500GB $0.01/GiB $10.00
Vultr Pooled between VPS, at least 500GB $0.01/GB $10.24
Fly.io Depends on region, 30GB - 100GB $0.02 – $0.12/GB $20.48 – $122.88
Vercel Depends on plan, 100GB - 1TB $0.15 – $0.47/GB $153.60 – $481.28
Render Depends on plan, 100GB - 1TB $30.00/100GB $307.20
Netlify Depends on plan, 100GB - 1TB $55.00/100GB $563.20

1 Azure will stop serving when the quota is exceeded with no recourse, other than upgrading to a paid plan for it and paying $0.20 per GB ($204.80/TiB). Also beware, the maximum deployment size for the free plan is only 250MB.

2 “Unlimited” of course still means that there’s some secret limit that may be enforced indiscriminately.

3 Cloudflare has a history of simply blocking access if the traffic gets too much. There’s the risk of randomly getting banned though. Cloudflare Pages has a deployment limit of 20000 files at a maximum of 25MB per file.

4 surge.sh doesn’t mention any limits at all, but as of 2019, they apparently had a limit of 4500 files and 430MB maximum deployment size. I imagine there are higher limits in place with their $30.00/month Professional plan.

5 OVH provides limited high-speed egress traffic of at least 1TB in their Sydney and Singapore regions. They throttle the bandwidth to 10 Mb/s after the quota is exceeded. UpCloud provides limited high-speed egress traffic of at least 1TB for all their offerings. They throttle the bandwidth to 100 Mb/s after the quota is exceeded, except if you’d like to pay as per the table.


Traffic with providers hosting on a CDN is mighty expensive! And Netlify tops that list. There’s a noticeable divide between those providers and the ones providing a VPS - where edge web hosting isn’t baked in as part of the service. These providers hover around $10.00 per TiB, whereas traffic with serverless providers can cost multiple orders of magnitude more.

The three that stand out are Azure, Cloudflare, and surge.sh, which would all provide predictable pricing. As stated in the fine print, Azure will stop serving your website when the 100GB free quota is exceeded, with no way to get more traffic if needed. 100GB should be plenty for me, but the miniscule maximum deployment size of 250MB ruins the offer. It’s designed for enterprise-y SPAs with little content, as the 500MB you get with the step up paid plan are still far too little for a media-heavy website. At the time of writing, this website’s deployment comes in at 244MB, and it’s far from heavy on the media front (though the originals of all images are part of the bundle, which accounts for most of the size). surge.sh also disqualifies itself for the same reason, though in both cases one workaround would be to host the media elsewhere. It’s just not as convenient.

What I lack in this whole comparison is a serverless hosting provider that isn’t free, but that also isn’t expensive. I get that the generous free offerings are likely financially sustainable because of economies of scale, but I don’t see a reason not to pay for a good service - especially if I get the additional benefit of having to move hosting providers less often. The offerings of the usual suspects are either free, or $20.00, which is a little too rich for me. I wonder if that’s really the price necessary for these services to be sustainable.

So I went with Cloudflare. Of course, it’s also not always sunny in Phil Cloudflare city, but I’ll be on the lookout for another solution. At least the infrastructure is some of the most advanced in the world and my personal website has horribly overkill peerings and points of presence all over the globe. Can’t be mad at that, can I?

Fingers crossed I don’t get my Cloudflare account banned out of nowhere.

jama.me - Moving To a New Domain

Honestly, I’m still somewhat conflicted with this decision.

Deliberations

It’s not that I decided on a whim to have a change of scenery, or that it was “just time” to change it up. There hasn’t been character development that would warrant such a change. maslov.io has been my home for a pretty long, but not that long of a time, but I still decided to basically reserve it for family use. For things like email addresses, private services and stuff like that. No idea whether anyone in the family will actually make use of it for something, but it’ll be there when they need it. I’ll probably have this domain for life at this point, or until the registry goes under.

Carving out a little space for myself in the namespace and moving to jan.maslov.io felt awkward, especially because that’s also almost exactly an email address I use professionally, which would’ve made it confusing. I also wanted to emphasize the personal website aspect more with whatever address I ended up with.

And then I got lucky enough to snatch away jama.me just as it wasn’t renewed by the previous owner who just sat on it! Sure, it’s no .com, but the Montenegran .me ain’t shabby for a personal thingy I think.

The Actual Move

Luckily, the previous Vultr VPS didn’t have any important services running anymore, so I could transition very cleanly. I only had to make sure to have good redirects in place.

I don’t plan on using Cloudflare Pages’ build infrastructure, since it’s enough for me to build the page locally and upload it. So the plan was:

  1. Create Cloudflare account
  2. Onboard the new domain into Cloudflare, configure their nameservers to use jama.me’s apex
    • Register the domain in Cloudflare and wait until the nameserver change is recognized
    • Transfer any DNS entries over via Cloudflare’s automatic onboarding. But beware, it missed a couple entries for me
  3. Using wrangler, bring the website online (Cloudflare Docs)
    • Deploying to Cloudflare Pages is buggy with Firefox
    • Create the Cloudflare Pages project
      wrangler pages project create PROJECT_NAME
    • Upload the Astro build output into the project via wrangler
      I added this as a deploy script to my project’s package.json:
      npm run build && npx wrangler pages deploy ./dist --project-name PROJECT_NAME
  4. The new website is online! Yay! Go through all of Cloudflare’s gazillion settings and set everything up
  5. Make Cloudflare’s domain inaccessible (Cloudflare Docs)
  6. Add _redirects file (Cloudflare Docs)
    • I changed a couple URLs for the blog posts and I stopped providing multiple languages (the blog was already English-only, hence no redirects for /de/blog/:title), so this is the current redirects file:
      /de / 301
      /de/ / 301
      /en / 301
      /en/ / 301
      /de/blog /blog 301
      /de/blog/ /blog 301
      /en/blog /blog 301
      /en/blog/ /blog 301
      /en/blog/hello-world-and-this-blogs-rules /blog/hello-world 301
      /en/blog/hello-world-and-this-blogs-rules/ /blog/hello-world 301
      /en/blog/my-hackintosh-part-1-hardware-and-undervolting /blog/hackintosh-undervolting 301
      /en/blog/my-hackintosh-part-1-hardware-and-undervolting/ /blog/hackintosh-undervolting 301
      /en/blog/the-newbie-performance-of-the-razer-blade-15-2018 /blog/razer-blade-comparison 301
      /en/blog/the-newbie-performance-of-the-razer-blade-15-2018/ /blog/razer-blade-comparison 301
      /en/blog/:title /blog/:title 301
      /en/blog/:title/ /blog/:title 301
  7. Disconnect the apex and www DNS records of the old domain from the Vultr VPS
  8. Setup HTTP redirects for apex and www from the old to the new domain via domain registrar
  9. Onboard new domain into Google Search Console and trigger an address change from the old to the new domain

And aside from Google not being cooperative the first couple of days, it worked flawlessly this time! What I didn’t do is redirect files and images. Frankly, a bit too much for me, since Astro outputs images with generated filenames.

Moving on

Website screenshot, jama.me 2024 website

Loosely following web simplicity good practices (wouldn’t exactly call them the best practices though), I kept the site really simple in this first iteration. I think it looks good and reads well in both dark and light mode and on desktop and mobile screens. Of course, being a static website, it performs well according to Google:

Website screenshot, PageSpeed Insights overall score 100

I also made a slight adjustment to my logo. Initially, when I just introduced the logo around 2017, I heard that it looks too generic. Lately, I asked again, and overwhelmingly heard that it’s the symbol representing me, it looks cool, and it shouldn’t change under any circumstances. So I kept it simple, only introducing a slant and a little refinement.

I think it looks less bland and more dynamic this way while retaining the shape.

Aside from me being conflicted about the domain change, I’m now finally happy with my website’s setup and am motivated to write more. The hosting will have to prove itself first before I really trust it. And I’ll be on the lookout for a CDN static site hosting provider that fits the bill.

Anyway, here’s to lots more years!