Outside work, I run personal services such as Vaultwarden, mail services, domain services, local AI, and private access between devices. Arch is my daily OS, with experience across Ubuntu, Arch, and Alpine. Docker, Docker Compose, ports, firewalls, domains, secure access, and WireGuard are not abstract topics for me. They are part of how I practise.
The stack I actually run
My personal infrastructure is deliberately minimal. A single VPS running Docker Compose, behind Nginx, with Let's Encrypt for TLS. No Kubernetes. No service mesh. No orchestration layer that needs its own babysitting.
- Vaultwarden: password management for all devices
- Mail server: custom domain email with Postfix and Dovecot
- DNS: domain management for personal and project domains
- WireGuard: private network access between devices
- Nginx: reverse proxy for all services with a single entry point
Each service was added only when the need was real and the maintenance cost was understood. That discipline is harder than it sounds.
Why Vaultwarden first
Password management is the most personal infrastructure decision you can make. Using a self-hosted Vaultwarden instance means every credential lives on hardware I control. No third party stores my secrets. No breach at a password vendor becomes my incident.
The trade-off is operational responsibility. If the service goes down, I cannot log into anything until it is back. That constraint is honest. It reminds me every time that owning your stack means owning the failure cases too.
WireGuard as infrastructure glue
WireGuard is the backbone. It connects my laptop, phone, and server into a single private network. Services that should never be public, such as database ports, admin interfaces, and internal dashboards, are accessible only over WireGuard.
- No exposed ports except 80 and 443 on the VPS
- No VPN server that depends on a third-party provider
- No difference between local and remote: the network just works
Local AI as a practical tool
Running LM Studio and Ollama locally changed how I think about AI tools. When inference happens on my hardware, there is no API key, no rate limit, no data leaving my network. The models are smaller and slower than cloud alternatives. But they are always available, and they cost nothing to query.
Local AI is useful for summarisation, drafting, and code review. It is not a replacement for cloud models on complex tasks. But having both options means I can choose based on what the task actually needs, rather than what is easiest to integrate.
The practice of owning the stack
Self-hosting is not about being impressive. It is about keeping the feedback loop tight. When something breaks, it is mine to fix. When a configuration is unclear, it is mine to document. Every service I run teaches me something about the services I build at work. The stack I own is also the stack I understand best.