-- site — writeonce.de: the language tutorial, served BY the language. -- Full stack in one binary: writeonce-framework ([deps]) for HTTP/routing/ -- auth, wo-html ([deps]) for server-rendered pages with Tailwind-style -- utilities, @table + WAL for the chapters themselves. The site is its own -- final chapter: /ch/serving shows this file's shape. -- -- SITE_TOKEN=... WO_DATA=./data ./site 8080 -- -- Behind nginx/caddy for writeonce.de: the proxy terminates TLS and -- forwards to 127.0.0.1:8080 (the framework speaks HTTP/1.1 keep-alive). -- -- This file is the BOOTSTRAP and nothing else: seed, routes, serve. The -- model is types.wo; every feature is a directory holding its view and -- its controller. use env use framework use framework/router use home use chapter use admin use health fn main(args: multi Text) -> Int { if len(args) < 1 { print_err("usage: site (SITE_TOKEN gates /admin; WO_DATA makes chapters durable)"); return 2; } let port = parse_int(args[0]); if port == nil { print_err("site: must be a number"); return 2; } let token = env.get("SITE_TOKEN"); if token == nil { print_err("site: SITE_TOKEN is required (the admin route's bearer token)"); return 2; } seed_if_empty(); let app = App { middleware: [], routes: [] }; app.use_mw(Mw { m: Logging {} }); app.get("/", Home {}); app.get("/health", Health {}); app.get("/ch/:slug", ShowChapter {}); app.post("/admin/ch/:slug", AdminEdit { token: "${token}" }); return app.serve("127.0.0.1", port); }