A laptop that runs like a VPS.
This page is server-rendered by Next.js on a Dell Latitude sitting on a desk — reachable from anywhere, deployed through a self-hosted PaaS, with no cloud bill.
$ uptime up 37h, load 2.96, 2.94, 2.87 $ free -h | grep Mem 15.4G total, 7.5G used $ tailscale funnel status https://predev-from-kawsar-home-server.tail0fceaf.ts.net (Funnel on) |-- / proxy http://127.0.0.1:80 $ docker ps --format '{{.Names}}' latitude coolify coolify-proxy coolify-db ... $ ▍
Real numbers, read at render time.
Two doors in. One public, one private.
Visitors only ever touch the proxy. The dashboard and shell stay inside a WireGuard network that only your devices can join.
Everything a VPS has, nothing rented.
Linux Mint 22.3
Ubuntu 24.04 base on a Dell Latitude 5300 — 8 cores, 16 GB RAM, NVMe. Sleep and lid-suspend disabled.
Tailscale
WireGuard mesh VPN. Reach the box from anywhere — no public IP, no port forwarding, works behind a phone hotspot.
Tailscale Funnel
Publishes the proxy to the internet with automatic HTTPS at a *.ts.net hostname.
Coolify
Self-hosted Vercel/Heroku. Deploys from GitHub, manages env vars, databases, logs and backups.
Traefik
Routes each request by hostname and path to the right container.
Docker
Every app and database runs isolated in its own container and restarts on boot.
From git push to public URL.
Push code
Commit to GitHub. Coolify's GitHub App sees the push.
Build
Nixpacks or your Dockerfile builds an image on this laptop.
Route
Traefik picks it up from the domain you set — http://…ts.net/path.
Live
Funnel serves it over HTTPS to the whole internet. Seconds, not minutes.
Hardened by default.
- Private control planeCoolify dashboard and SSH are reachable only inside the tailnet.
- Key-only rootPermitRootLogin prohibit-password; Tailscale SSH for humans.
- Firewallufw default-deny inbound; only the ports the stack needs.
- fail2banBans IPs that brute-force SSH.
- Unattended upgradesSecurity patches install automatically.
- No open router portsCarrier NAT stays closed; all ingress comes through Tailscale.