My Personal Blog
Created: Feb 1, 2025
After hosting my legacy Laravel based personal website for several years, I decided it was time for a complete refresh. This decision wasn’t made lightly, but my primary motivation was reducing the ongoing maintenance required to keep a full-fledged Laravel web app running, updated, and secure.
My goal for the updated website was to retain the core functionality of the legacy site while minimizing dependencies, reducing security risks, and simplifying overall complexity. I wanted a space where I could quickly and efficiently share my side projects. With this in mind, I approached the project with a Minimum Viable Product (MVP) mentality, ensuring that I could expand and improve it over time as needed.
Tech Stack
- Hugo – Static site generator
- GitLab CI – Continuous integration
- GitLab Pages – Free static site hosting
Decisions
After some consideration, I chose Hugo as my static site generator for several reasons. It provides many quality-of-life features necessary for a blog without requiring me to reinvent the wheel. Additionally, Hugo makes it easy to update dependencies, ensuring that my website remains maintainable for years to come.
I opted for a static website instead of maintaining a back-end relational database to reduce security risks and ongoing server maintenance. This also comes with the added benefit of lower running costs. While using a database does carry a certain “street cred,” Hugo’s templating system is more than sufficient for a simple tech blog.
Rather than using an existing open-source Hugo template, I decided to create my own CSS template. While this required extra effort, it gave my site a unique look and allowed me to express some creativity—something I always enjoy.
For hosting, I switched from Heroku to GitLab CI & GitLab Pages. Previously, running my site on Heroku required a dedicated VM to keep the application live in the cloud. GitLab offers a similar service for free, which is an incredible value. One of GitLab’s primary limitations is repository size, which is currently capped at 10GB—more than enough for my needs.
Features
Main Pages
The website currently includes:
- A Main page that serves as an introduction and “About Me” section
- A Resume Page that provides a JSON Resume
- A Projects list page
- A Blog list page
Blog
Blog posts are stored in the /content/blogs/{BLOG-TITLE}/index.md directory and support Markdown styling for:
- Code snippets
- Embedded images and videos
- A
featured image(automatically applied when an image namedfeatured.{img_ext}is saved in the same directory)
Each blog post includes tags that categorize the content based on its topic.
Tags
Tags are assigned to blog posts and can be selected from the Tags sidebar on the /blog/ page. Clicking a tag filters and displays only blog posts associated with that tag.
Projects
Projects function similarly to blog posts, supporting Markdown styling, but they are intended for larger, less frequently created personal projects.
Each project includes additional metadata fields:
project_tag– Associates the project with a relevant blog post taggit_url– Links to the project’s Git repositorycreated_date– Date the project was starteddeprecated_date– Date the project became obsolete (if applicable)
Unlike blog posts, each project has only one unique associated tag. When viewed on its own page, a project will list all blog posts that share its associated tag.
Projects are stored in the /content/projects/{PROJECT-TITLE}/index.md directory. Similar to blog posts, they support a featured image, which should be placed in the same folder as featured.{img_ext}.
Resume
The Resume section presents a JSON Resume, allowing visitors to view a structured version of my resume or download the raw JSON file.
Takeaways
I believe I have successfully reduced maintenance and ongoing server costs while preserving the core functionality of my previous website. The essential features I set out to build are now in place, with room to expand as needed.
By keeping external dependencies minimal, I’ve also reduced security risks and simplified future maintenance. More importantly, I now have a clean, concise platform to showcase my work.
I look forward to adding features over time, but more than anything, I’m excited to document and share my side projects as I continue working on them.