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: