HostNodex
A self-service VPS hosting platform I built end to end: customer panel, automated provisioning, Stripe billing and an internal admin console. The hard part was billing — making a running server, a failed card and per-country EU VAT settle into one state nobody has to fix by hand.
HostNodex is a self-service VPS hosting platform. Pick a plan and a Linux distribution, and a KVM-virtualised server on NVMe SSD storage is provisioned and handed over with full root access. The whole thing runs from one web app: no scattered consoles, no command line, and no specialist knowledge needed to keep a server alive.
The positioning is the product decision. It is not trying to be a hyperscaler — it is trying to be the thing a developer or a small team reaches for when they want a real server without a thousand adjacent services and a bill they cannot predict.
What I built
Everything the customer touches, and everything behind it: the public site, the customer control panel, the internal admin and operations console, the provisioning layer that drives the KVM virtualization API, and the billing that ties those two together.
- Full-stack application in Python and Flask on PostgreSQL, with Jinja templates and vanilla JavaScript — a customer panel plus a separate internal admin console.
- Automated VPS lifecycle — one-click deploy, start, stop, reboot and reinstall, plus snapshots and backups, all driven through a KVM virtualization provider API.
- Stripe billing — recurring subscriptions, multi-currency presentment by request origin (SEK, USD, EUR, GBP), automatic per-country EU VAT, refunds, and the full account lifecycle.
- Security hardening — mandatory MFA with TOTP and recovery codes, least-privilege PostgreSQL roles, a content security policy, CSRF and SSRF defences, and enumeration-resistant account recovery.
- Operations — Docker Compose behind nginx, a Git-driven no-cache build and deploy pipeline, internationalisation, and the public SEO surfaces.
The part that was actually hard
Billing, by a distance. A server is a running physical commitment with its own monthly rhythm; a subscription is a Stripe object with a different one. They disagree constantly. A card fails while the machine is still serving traffic. A customer cancels mid-period and reasonably expects the server until the period ends. VAT changes because they moved country.
Every one of those has an obvious individual answer and the obvious answers contradict each other. Getting them to resolve into a single predictable state — with no manual intervention, and without ever producing a bill the customer did not expect — took longer than the provisioning layer it sits on top of.
Where it runs
Servers run from a data centre in Stockholm, Sweden. Customers are worldwide rather than EU-only, and the GDPR framework is applied to all of them equally instead of only to the ones it legally covers.