Pick a depth. Each prompt opens in your AI pre-loaded with the lesson. Click a row to preview the prompt.
Before you scale, you have to ship. Most teams skip this step and end up with a multi-region Kubernetes setup for a service that has 14 users — premature complexity that costs three months and a hire. The Day 0 stack is the smallest thing that can serve real users: one VM, one process, one database, TLS at the edge. Every decision in the next ten modules is about what you add on top of this — so getting Day 0 right means knowing exactly what's there to begin with.
A real Day 0 stack: a $5 DigitalOcean droplet running your app behind Caddy (or nginx) for TLS, talking to a managed Postgres in the same region. That's it. No load balancer, no Redis, no Kafka, no Kubernetes. The app is a single binary or a node server.js and you deploy by rsync or git pull. You can serve a few hundred users a day with this and a 99.5% uptime that beats most startups' Kubernetes monstrosities.
<2ms.rsync or git pull + a systemctl restart. Don't use Docker yet — get the dumbest path working first.caddy reverse-proxy --from yourdomain.com --to localhost:8080. You now have HTTPS for free.curl -s https://yourdomain.com/users | jq '. | length' from your laptop. If it returns 100 rows, your Day 0 stack is real.// main.go — a Day 0 service that does something real
package main
import (
"database/sql"
"encoding/json"
"log"
"net/http"
"os"
_ "github.com/lib/pq"
)
var db *sql.DB
type User struct {
ID int `json:"id"`
Email string `json:"email"`
}
func main() {
var err error
db, err = sql.Open("postgres", os.Getenv("DATABASE_URL"))
if err != nil { log.Fatal(err) }
db.SetMaxOpenConns(10) // we'll come back to this in module 3
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
})
http.HandleFunc("/users", listUsers)
log.Println("listening on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func listUsers(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query("SELECT id, email FROM users ORDER BY id LIMIT 100")
if err != nil { http.Error(w, err.Error(), 500); return }
defer rows.Close()
var out []User
for rows.Next() {
var u User
if err := rows.Scan(&u.ID, &u.Email); err != nil { http.Error(w, err.Error(), 500); return }
out = append(out, u)
}
json.NewEncoder(w).Encode(out)
}go run main.go