(** Server startup. Loads configuration, then hands the resulting routes to Dream. Startup fails loudly rather than falling back to defaults, so a typo in a config file is noticed immediately instead of silently changing which repositories are served. The one exception is an explicit [git_project_root] on the command line, which is enough on its own to run without any config file. *) val run : ?git_project_root:string -> unit -> unit (** Load configuration and start the HTTP server. When [git_project_root] is provided it overrides the configured value (and suppresses the startup failure when no config file exists). Does not return under normal operation. *)