This website is hosted from a Raspberry Pi sitting on my own network. It is not generated by a website builder, hosted through a large platform, or hidden behind a content management system. It is a small, hand-built static website made with HTML, CSS, JavaScript, Nginx, Git, DNS configuration, and a healthy amount of trial and error.
Part of the reason I built it this way was practical. I wanted a personal website where I could showcase my technical aptitude and interests in a format more permanent and personal than social media, and more in-depth than what could fit on a resume. Additionally, throughout my professional and academic career, I have gained a lot of experience serving local webpages; I figured it was time to utilize those skills to provide something to a potentially worldwide audience.
That brings me to another deeper reason for building this website, my personal philosophy as it relates to technology: I am interested in technology serving people, not the other way around. A lot of modern technology asks that people adapt themselves to platforms behind a veil, changing algorithms, various tools "as a service", and interfaces designed to capture attention at the expense of efficent communication. I wanted this site to be the opposite of that. It is simple, readable, lightweight, and easily understandable. It exists to communicate, to serve people - as technology ought to do.
The foundation of this website is a Raspberry Pi running Raspberry Pi OS Lite. I chose the Lite version because this machine does not need a desktop environment, I can SSH into easily. Further, it IS a server - on an older Pi, not to mention - so the fewer unnecessary services running, the better. After installing the OS, I connected the Pi over SSH and did the initial setup from the command line: updating the system, setting the hostname, configuring local network access, and preparing it to run as a web server.
For serving the website, I used Nginx. Nginx listens for web requests and serves the files that make up the site. In this case, the public web root is a directory where the HTML, CSS, JavaScript, images, and other static files live. When someone visits a page, this one for instance, Nginx simply returns the appropriate file. This keeps the site fast, simple, and relatively easy to secure.
The layout, as previously referred to, is intentionally "old-school". No nonsense. The pages use static HTML and a shared CSS file. The background image is handled through CSS so that the central page content remains readable while the surrounding image gives the site a fitting, personal character. The homepage has a photo and a small introduction with links to the main sections. Other pages use the same navigation, but with different extraneous details, keeping each page tailored and unique while the site as a whole is consistent and predictable.
The website is also tracked with Git in a private repository. I do not edit the live files directly. Instead, I work from the site, usually on my home computer, test locally, commit changes, push to the repository, and pull and deploy from the Raspberry Pi using a small bash script. This copies the updated files into the Nginx web root while keeping the source repository separate from the public directory. This gives me version history, rollback ability, and a streamlined development process.
Making the site available over the internet required several pieces to work together. The domain points to my home public IP through DNS records. My router forwards HTTP/HTTPS traffic to the Raspberry Pi on the local network. Nginx is configured to recognize the domain and serve the correct site. HTTPS is handled with a Let's Encrypt certificate with Certbot managing certificate creation and renewal. Of course, a firewall on the Pi limits what services are exposed.
I also added a rather extensive music page that can stream select tracks from a mounted external drive. That drive itself actual contains a larger music library, but only a select folder is exposed to the website. Nginx serves that folder through a controlled route and the JavaScript builds a small, simple custom audio player. That custom player was a unique creative challenge and a joy to make work.
The blog section is static, with a small amount of JavaScript to make the site easier to maintain across time. Blog post data is stored in a JS file with titles, labels, URLs, and excerpts. The blog page uses that data to generate an archive by year and month, along with labels (e.g. technology, philosophy, music) while the individual posts are still just plain HTML files. This gives a simple, scalable structure without needing a database or full blogging platform.
So, this website is both a personal undertaking and an excercise in systems administration. It involves Linux administration, web server configuration, DNS, HTTPS, firewall rules, file permissions, Git workflows, scripting, storage mounting, JavaScript, and network security; it also involves writing, design, restraint, value-judgements, and communication.
This is where the idea of technology serving people comes back in. The purpose of this site is not to be impressive for it's own sake. The purpose is to communicate clearly who I am, what I work on, what I can offer, what I am learning, and what I think is worth writing down. The technology underneath matters because it gives me ownership and understanding, but it stays in service of the human goal.
in