The Tech Behind My Domain
The tech decisions I made when creating this domain and why they work for me.
March 5, 2025 at 2:55 PMMy VPS
My server at it's heart is a vanilla Ubuntu server that I installed Coolify on. It allows me to have several processes run in their own sandbox on a single server. The other processes I run are a Node server for this website and a Strapi CMS instance to store things like this blog post. I created subdomains for Coolify and Strapi so I can connect to them from anywhere with a HTTPS connection in the browser. I've also setup my DNS with my iCloud account allowing me send and receive emails from custom emails with this domain. Not only for personal use, but for Coolify and Strapi to email me passwords reset links in case of forgotten/lost passwords.
My Website
This site is a Node application running Express.js for routing and the HTML is rendered server-side; all in ES modules. The index page starts with just information about me, but everything else is dynamically generated on the server. The Bluesky post is an NPM package I authored that connects to my Bluesky account, gets my author feed (and again at the top of the hour to update information), then creates HTML that I put in the page. To display the list of articles, the server does a fetch request to my self-hosted Strapi CMS and populates a list of articles to display. As for the actual article page, it is another fetch request but the image data is parsed and put into an Alpine.js template to create a client-side rendered image carousel.
My Decisions
Hosting
In all of my decisions, I wanted to pick what ever was closes to web standards, easily usable in most environments, or easy to pick up move elsewhere. Which is why in the area of hosting I decided to go with renting a Linux server running Ubuntu and Coolify. If I can run my site there, I can easily move it to something like DigitalOcean or use a service like Cloudflare if I were to have traffic scaling issues in the future(which I don't see being a problem).
Back-end
I've written some things in PHP, React based frameworks, and SvelteKit, but they all(for the most part) are running an abstraction of your code; not the code it self. So you can run into issues in production that give you errors that are things you didn't necessarily write. I know Nodejs + Expressjs is a JavaScript abstraction of C++, but your code is triggering lower level code and not generated code. Choosing these two give me a lot of freedom in how I want to write my code and are used enough that searching how to fix an issue may be easier.
Front-end
I wanted to write as close to vanilla HTML/CSS/JavaScript until it didn't make sense to do so anymore. I created page templates for the homepage and article pages in ES modules as template literals where the server collects data and renders the page for the client. If using vanilla HTML becomes to cumbersome to make something(like multiple image carousels on a page), I can hand that off to the client with Alpinejs with a template and data. This is turn lowers the HTML payload being sent to the client when you don't know how many of an object will be on the page.
Final Thoughts
Overall, this setup empowers me with a streamlined and versatile web infrastructure, combining self-hosted control with professional-grade tools. The modular nature of Coolify, paired with the seamless integration of Node.js and Strapi, ensures a robust foundation for development and content management. By leveraging custom subdomains, secure HTTPS connections, and a well-configured DNS, I've created a system that is both flexible and secure, meeting my personal and professional needs with efficiency.
Every aspect of my website reflects thoughtful and deliberate choices to align with modern web standards while maintaining flexibility. I’ve selected Node.js and Express.js, which provide freedom in writing code closer to the metal compared to higher-level abstractions like React-based frameworks or SvelteKit. This ensures more direct control and easier troubleshooting. The front-end follows a minimalist approach with vanilla HTML, CSS, and JavaScript where possible, reserving client-side rendering tasks for tools like Alpine.js to handle dynamic features like image carousels. This combination of technologies and workflows forms the backbone of a site that is efficient, reliable, and ready to adapt to future needs.