Every time I pushed to GitHub, the ritual was the same: SSH into the server, git pull , restart the process (hoping the port was free), and pray nothing broke. Logs were scattered, rollbacks were manual, and TLS felt like an afterthought. That works for a small demo, but it gets old very quickly. I wanted push-to-deploy: commit, push, wait for health checks, and get a live URL. I knew platforms like Render and Fly.io solved this elegantly - but I wanted to understand how . Not at the API level. At the level of what actually happens when a push triggers a deployment. So I built Forge: a small self-hosted PaaS. A GitHub push becomes a running process on my own AWS infrastructure, with health checks, logs, routing, TLS, rollback, and metrics. No Docker daemon. No Kubernetes cluster. Just Linux processes, cgroups, namespaces, Caddy, SQLite, Terraform, and Ansible. However, Forge became much more than «run my app after a push».…