This Site is Handmade
Essentially, everything about this site is hand-coded by me. There are font libraries that I didn't make and clever ideas on how to implement things that programmers have kindly shared, but it's all assembled by me.
As such, things might behave weirdly, and I would not recommend that you copy and paste my solutions into your needs without actually understanding that my code works perfectly for your needs. Said differently, in no way do I provide a warranty, nor do I guarantee that bad things won't happen if you cut corners.
Do your research. Test. Then deploy.
All the information is current as of February 2025.
Major Site Overhaul & Infrastructure Upgrades
Over the past few days, I have undertaken a significant overhaul of this site’s infrastructure, shifting from a traditional shared hosting environment to a fully containerized deployment running on a Linode VPS. This move was driven by a desire for greater control, security, and flexibility in how I build and manage my projects, ensuring that I can refine and expand functionality without being constrained by the limitations of shared hosting.
The first major change was moving away from DreamHost's shared hosting and transitioning to a Linode VPS, where I now have full root access and control over my environment. Instead of a standard Apache/PHP setup, I have re-architected the site to run inside Docker containers, separating concerns between the web server (Apache/PHP) and the database (MySQL). By leveraging Docker Compose, I can easily manage these services, ensuring that everything runs consistently across deployments.
To facilitate traffic management, I have configured Nginx as a reverse proxy, which not only enables clean URLs but also provides better security and greater flexibility in routing requests. This also allowed me to integrate Let’s Encrypt SSL certificates, ensuring that all site traffic is encrypted by default.
Perhaps one of the most impactful changes was setting up automated deployment via GitHub webhooks. Now, whenever I push updates to my GitHub repository, the Linode server automatically pulls the latest changes and restarts the relevant Docker containers. This eliminates the need for manual updates, making deployments seamless and reducing downtime.
Email handling has also been upgraded. Rather than relying on DreamHost, I have configured my professional email address, brent@larowe.info, to be hosted through Fastmail. This required updating my domain’s MX, SPF, DKIM, and DMARC records within Dreamhost (which remains my domain registrar) to ensure proper email authentication and deliverability. The result is a reliable, independent email system that integrates smoothly into my existing workflow.
For configuration management and sensitive file backups, I have implemented an automated system that securely transfers critical environment files, such as .env
, to my Nextcloud instance using WebDAV. These backups run on a daily schedule, ensuring that key configurations are always retrievable in the event of an issue. Because these backups are handled separately from the main site’s version-controlled codebase, they can be safely restored without unnecessary complications.
To prevent data loss and ensure system stability, I have also enabled Linode’s backup service, which provides full-system snapshots and easy restoration capabilities. Additionally, I configured Docker containers to restart automatically on boot, preventing downtime in the event of a server restart or unexpected failure.
With this new foundation in place, I am now in a position to begin building the next layer of functionality: a database-driven content system. While the site currently remains lightweight, I have structured my MySQL database to support dynamically generated content. The next major project will be implementing a blog post publishing system, allowing me to store, retrieve, and categorize posts efficiently.
At its core, this entire effort has been about building a system that is both robust and extensible. By moving to a self-managed VPS, leveraging containerized services, automating deployments, securing email and backups, and preparing for structured content management, I now have the flexibility to iterate on this site in ways that would not have been possible under traditional shared hosting. The infrastructure is now fully in my hands, and I look forward to expanding its capabilities in the months ahead.
The below information was current as of July 2024.
Hosting
I went with Dreamhost for this site. I had previously used them for the generic brentlarowe.com years ago when I also ran a personal Ubuntu node using Linode. At that time, I wanted a Minecraft server and a file server, and the snap package of Nextcloud (which was very easy to deploy) commandeered the web service. But that's less than important now.
Using them again and going with the top-level domain of "info", I reserved the host "larowe", but I still have brentlarowe.com pointing to larowe.info using a 301 redirect. The simpler website also gives a really easy email address to remember: brent@larowe.info.
Design
I knew I wanted something simple for the site. I believe that design is extremely useful, but it is so easy to be overly reliant on design to do the lifting of information. My vision for this site is to be full of information that is accessible, befitting my professional focus on the importance of connecting people with the information they need at the time they need it. I expect I will be continually improving that for this site as time goes on.
I made a couple design choices to hopefully make it easier to read things -- I chose an Adobe-available font, Futura, as the main sans serif font; I also decided to use an off-white background which I find to be easier on the eyes than bright white. I also chose to have hyperlinks be a bit obscured, instead relying on plain language that indicates there is something else to read or see. That can result in some hidden links, like the "Hand-crafted" link that got you here, but it's more important to me that people engage with the thoughts and move organically rather than to be coached that other pages exist. A person only has a few moments to engage with the content; why waste it on things that are different from the information you would like them to learn?
Architecture
I'm hosting the web root in a directory that is separate from the environments and application data that will query and insert data on the MySQL database sitting in the background. Named "SNAL" ("save now, analyze later" -- thanks, Nila!), it will also hold tables for my blog posts (eventually), allowing for retrieval of posts in a certain category (for example, posts on my data science stuff, or posts on my energy use thoughts).
At present, the DB situation is very, very lightweight. Since this is a personal project of mine, there's no need to scale much up, but I'm pleased to see that Dreamhost offers the ability to scale things up should I need to. I am aware that, at some point, remaining in a cloud-based structure is less cost-effective than rolling one's own server, but I figure I've got a long way to go before that's an issue.
Coding
I'm using PHP for most everything. I want the content to be rendered cleanly for users, but also maintain security for the information that I'm storing. Using PHP and having everything rendered server-side first makes sense, allows for flexibility in design, and extensibility as I tackle other challenges. While I will likely be using other languages to do other tasks, starting everything in PHP is a good choice at this stage.
I'm also writing up all of my database connectors in python. While I am having to brush up a little on the syntax and standards, using IDEs is helping out tremendously in that effort. I'm very satisfied with JetBrains' suite of products, and PyCharm is working well for my needs at this stage.
I've done analysis in R, Tableau, BI, and QlikSense; not to mention Excel. For this site, I'll be using R as exclusively as I can. It's a hard program to master, but so much more precise if you know what you want to show in your data visualizations. I'm not sure if it's capable of being quite as pretty as some of the visualizations I've seen with Tableau...
But currently, the coding is quite simple, with the trickiest thing written being a PHP script that automatically detects what subdirectories exist below the location of the script, display them, and hyperlink them allowing one to see the content in those nested directories. I got a ton of help from other coders in creating it, and it works. I'd like it to display the title of the page, but that's an effort for another time.
I'm using a suite of programs made by JetBrains, having used their DataGrip product for years when handling information management tasks while at the University of Chicago Laboratory Schools; I test my work locally using MAMP to run a PHP server and ensure the code is behaving as expected; I use GitHub to track my versioning; I use Tower when I want a nice graphical interface while managing the repository; and I use good ol' Terminal when I want to pull updates into the local branch on my web hosting service. This is, of course, done through SSH.
Content
I write all of my own content, which can be a bit rambling. I will probably tighten things up as time goes on, but will probably never change the meat and potatoes of the content -- if anything, it'll be trimming off unnecessary phrases that happen because I write in a nearly stream-of-consciousness way.
Linked in the nav bar is the podcast that I create with my friend, Zach. I currently use Adobe Audition to record my end of the podcast, then I take his MP3, mix it, clean up the levels, trim out the coughs and sniffs and other unpleasant noises, and ensure that it is suitable to listen to comfortably while driving down the road. I hate content that can't get the volume levels consistent.
I have plans to write up the Dungeons & Dragons campaign that I'm running for friends of mine, and will also hopefully pop up some DAW created music... At least, that's the plan!
Management
All of this is managed with Basecamp, which is best when used with others, but I find it to be sublime at being what I need it to be to capture action steps, thoughts, resources, and keeping it all together for self-accountability. Granted, my day-to-day task management tool is, and has been for a very long time, OmniFocus. The GTD method of popping something into an Inbox and then enacting the discipline to check that Inbox, file it accordingly, review the projects/lists/groupings that are important in your life, and then acting on those items is extremely liberating. One is able to achieve so many things that bring them joy, keep on top of obligations that pay the bills, and remind themselves of the interesting thoughts they had.