Part 1: @levelsio (2026). Part 2: same VPS playbook, different runtime & AI tool.
SITE=example.com SERVER=my-vps (Hetzner VPS) TAILSCALE_IP=100.x.x.x TAILSCALE_DNS=my-vps.tailnet.ts.net SHARED_PHILOSOPHY=ship fast, self-host on VPS, no Docker/K8s, SQLite until Postgres needed SHARED_INFRA=Hetzner VPS + Tailscale admin + Cloudflare Tunnel (planned) + block inbound firewall SHARED_GOAL=115x cheaper than managed platforms at scale ($2,932/yr vs $338,913/yr @ 4B req/yr) LEVELS_STACK=PHP + jQuery + SQLite + nginx | Claude Code on VPS | Mosh | prod edits | --dangerously-skip-permissions LEVELS_LOOP=Hetzner → CF Tunnel + Tailscale → SSH → c (Claude Code) → edit prod PHP → close laptop MY_STACK=Bun + Hono + TypeScript + SQLite + nginx static | Cursor over SSH (cheaper than Claude Code) | tmux | git commits MY_DIFF=Cursor not Claude Code | Bun/Hono not PHP | git rollback not prod-first | no Mosh | no skip-permissions on prod MY_LOOP=Tailscale SSH → Cursor + tmux → Bun/TS on VPS → git commit → nginx static + /api/* → Bun:3000
| Layer | Levels | Me |
|---|---|---|
| Hosting | Hetzner VPS | Hetzner VPS |
| Admin | Tailscale + Termius | Tailscale + Termius ✓ live |
| Ingress | Cloudflare Tunnel, all inbound blocked | Same (CF planned) |
| Backend | PHP | Bun + Hono + TypeScript |
| Frontend | jQuery + HTML | Static HTML (Astro later) |
| Database | SQLite | SQLite |
| AI | Claude Code on VPS (c alias) | Cursor over SSH — way cheaper |
| Mobile SSH | Mosh | SSH + tmux |
| Deploy safety | Edit prod directly | git commit + rollback |
| Avoids | Local dev, Docker/K8s, public SSH, Vercel at scale | |
Users → Cloudflare → [outbound tunnel] → Hetzner VPS
├─ nginx:443 → static HTML
├─ nginx /api/* → Bun:3000 (Hono + SQLite)
└─ Tailscale ← laptop SSH (100.x.x.x only)
Firewall: block ALL inbound. Admin via Tailscale only.
Philosophy: Ship products that make money. PHP/jQuery/SQLite in 2026 is fine. Develop on the VPS, not locally. Single VPS, no Docker.
Security: Cloudflare Tunnel is outbound-only → block all inbound firewall. Tailscale for SSH. Never expose port 22 publicly.
Workflow: Tailscale → SSH (Mosh) → type c → Claude Code on prod → close laptop, AI keeps running.
Economics: ~4B req/yr → $2,932/yr self-hosted vs $338,913/yr managed (~115×). VPS ~10% utilized.
Hetzner → CF Tunnel + Tailscale → Mosh → c (Claude Code) → prod PHP/SQLite → profit.
Same: VPS-first, Hetzner, Tailscale, SQLite, no Docker, self-host for margin + control.
Cursor not Claude Code: Same “code on server via SSH” idea. Cursor on laptop is way cheaper for daily volume. tmux for long shell jobs when laptop closes.
Bun not PHP: TypeScript native, one runtime for API + scripts, AI-friendly. Hono = tiny HTTP router for /api/*. nginx serves static; Bun handles API. No PHP-FPM.
Extra rails: git commit before deploy. No --dangerously-skip-permissions on prod.
Tailscale SSH → Cursor + tmux → Bun/TS + SQLite → git commit → nginx + Bun → done.
cloudflared) — route domainc alias / Mine: Cursor over SSH)Tailscale on this server: ✓ · IP: 100.x.x.x · Host: my-vps