Behind the Blog
2025-07-20
Welcome to the very first post on the blog! To kick things off, I want to share a look at the tech stack powering this site. Everything here is either open-source or vibe-coded (I know, I'm sorry), running entirely on a free infrastructure—yes, you read that right: completely free!
The Actual Site: Django
This bit was all done by Gemini CLI through vibe coding. I add a Markdown file to a folder and it gets rendered out as a post. If I put the date in the future, it will not show (essentially a draft).
In case you've missed the tidal wive that is vibe-coding, the idea is to let the AI take the wheel and just tell it what you want. It is magical, strange and quite a disappointing experience. Maybe I'll do a different post about it.
To stick to the theme of low effort AI content, here's what it had to say about the backend:
The heart of this blog is built using Django, a robust Python web framework that's pretty versatile and efficient. Django's batteries-included approach allows me to rapidly develop features and manage content effortlessly, giving me full control over customization and extensibility.
Deployment: Nixpacks
I recently discovered Nixpacks. It's just a config file that describes how to deploy this site. At the time of writing, it is:
# nixpacks.toml
[phases.setup]
# This specifies the Nix packages to install. We need python and pip.
nixPkgs = ["python311", "python311Packages.pip"]
[phases.install]
# This command installs the Python dependencies for the project.
# Create a virtual environment and install dependencies into it.
cmds = [
"python3.11 -m venv .venv && . .venv/bin/activate && pip install -r requirements.txt"
]
[phases.build]
# This command runs the database migrations.
# Ensure python from the virtual environment is used.
cmds = [". .venv/bin/activate && python manage.py migrate", ". .venv/bin/activate && python manage.py collectstatic --noinput"]
[start]
# This is the command that starts the Django development server.
# The server will be available on port 8000.
# The `0.0.0.0` host is used to make the server accessible from outside the container.
# Ensure python from the virtual environment is used.
cmd = ". .venv/bin/activate && gunicorn blog_project.wsgi:application --bind 0.0.0.0:8000"
Continuous Deployment: Coolify
My self-hosted instance of Coolify makes continuous deployment easy. Whenever I push updates to my repository, Coolify takes care of rebuilding the container from scratch and deploying the latest version. It also issues a self-signed SSL certificate and manages the reverse proxy setup for me.
Cloudflare & SSL
To speed up load time, I've put Cloudflare in front. My domain points directly to Cloudflare, leveraging their global CDN network for performance and DDoS protection. For SSL configuration, use Full (Strict) SSL Mode, otherwise the Coolify SSL stuff will cause issues.
Hosting: Oracle Cloud Always Free
All this runs on an Oracle Cloud - Always Free ARM instance. Oracle's free tier provides me with ample resources to run all of this without ever needing to pay for hosting.
Disclaimer
Obviously I paid for the domain that this is hosted on, so I guess it's not really all free...