package bakeoff // App is one contestant. type App struct{ Slug, Language string } // Apps lists the contestants in report order. var Apps = []App{ {"go", "Go"}, {"go-rastrillo", "Go + Rastrillo"}, {"rust", "Rust"}, {"zig", "Zig"}, {"ocaml", "OCaml"}, {"haskell", "Haskell"}, {"swift", "Swift"}, {"nim", "Nim"}, {"spinel", "Spinel"}, } // Language names a slug's setup, or returns the slug itself. func Language(slug string) string { for _, a := range Apps { if a.Slug == slug { return a.Language } } return slug } // AppName and Host are the slug's Carloku app and hostname. func AppName(slug string) string { return "todo-" + slug } // Measurement hosts carry "-2": the first instances were deleted to empty // their databases, and a deleted host stays parked until an operator purges // it (2026-10-24). func Host(slug string) string { if h, ok := hostOverride[slug]; ok { return h } return AppName(slug) + "-2.bfj.oncarlos.com" } // hostOverride: Spinel's -2 run broke mid-way (its process exits under // load), and a used database can't be reset, so it was measured on a third // fresh instance; its -3 results were lost to an operator slip, so -4 (2026-10-24). var hostOverride = map[string]string{"spinel": "todo-spinel-4.bfj.oncarlos.com"} func URL(slug string) string { return "https://" + Host(slug) }