Skip to main content

Six Weeks of Rebuilding the Foundations

December 9, 2025 • Reflections

Over the last six weeks I have been quietly rebuilding the foundations of how I work, deploy, and think about the software I build. This post is a reflection on what changed  and what feels different now.

Why Hestia Had to Go

Hestia served a purpose. It made early deployments easy, especially when spinning up sites quickly. But as my projects grew and as I ran multiple Django services side by side the abstraction started working against me.

Apache and Nginx layered together. Ports that weren’t obvious. Configurations scattered across interfaces instead of living in files. Debugging became an exercise in archaeology. The issue was that Hestia introduced too many hidden decisions and I needed fewer layers, not more.

That’s when I made the decision to move away from Hestia entirely.

Caddy Changed the Mental Model

Switching to Caddy was a reset in how I reason about deployments.

A site is a domain.

A domain points to a port.

Caddy handles TLS.

Gunicorn serves Django.

Nothing else is pretending to help.

The first time I brought a Django site live with Caddy and realised I didn’t have to fight SSL, rewrite rules, or conflicting services, it was obvious this was the right direction.

Reverse proxying became explicit. Configuration became readable. Errors became traceable. Most importantly, I trusted what was happening again.

Django Feels First-Class Again

With Caddy in place, Django deployments stopped feeling fragile. No more guessing which service owned which port or wondering whether a change lived in Apache, Nginx, or a control panel.

The best bit though is that it removed that issue of  “it works locally but production is… different”.

Each project now has:

its own service

its own port

a clear, minimal Caddy config

predictable restarts

That clarity compounds. Every new site is easier than the last.

From “My Builder” to a Provisioner

One of the most important shifts over the last six weeks wasn’t technical, it was conceptual. I stopped thinking of my eCommerce builder as something I deploy, and started treating it as something that provisions environments.

That change forced discipline.

A provisioner can’t rely on memory.

It can’t depend on manual fixes.

It has to be explicit, repeatable, and resilient.

This meant:

formalising directory structures

standardising ports and services

removing assumptions

designing for automation, not convenience

The result is not just a better product but a system I can trust to scale without me holding it together by hand.

Finishing Adminita (Properly)

My Django admin project Adminita has existed for a while, but finishing it meant something specific this time including: 

  • consistent styling
  • predictable behaviour
  • reusable across projects
  • no hacks required to make it fit

Polishing admin UX might not sound exciting, but it matters. Admins are tools you live inside when building and maintaining systems. If they’re clunky, everything feels harder than it needs to be.

Adminita now feels complete and dependable.

Open-Sourcing the Boring but Necessary Parts

Alongside all of this, I extracted my bookkeeping software and invoice generator and put them on GitHub.

Bookkeeping and invoicing are the kind of things people outsource too quickly, then regret when they lose control or flexibility. I wanted these tools to be:

  • transparent
  • self-hostable
  • boring in the best possible way

Publishing them openly also forced better structure, cleaner boundaries, and clearer documentation. Open source has a way of doing that.

The Thread That Connects All of This: Ownership

Looking back, there’s a clear theme running through the last six weeks.

Ownership.

  • Owning deployments instead of delegating them to opaque systems.
  • Owning infrastructure decisions.
  • Owning the boring, foundational work.
  • Owning the long-term consequences of shortcuts.

Moving away from Hestia, adopting Caddy, building a provisioner, finishing Adminita, open-sourcing core utilities - all of it points in the same direction.

Less magic.
More clarity.
Fewer dependencies.
More confidence.

What Feels Different Now

The biggest change isn’t technical. It’s that new projects no longer feel heavy.

I know where things live.

I know how traffic flows.

I know how to debug problems when they happen.

I trust the platform I’m building on.

That trust is what makes everything else possible.

The last six weeks weren’t about speed. They were about removing drag and that’s a trade I’d make again without hesitation.

Thanks for sharing: