ADR-200: nikaia serve Is Cut, And The MVP Is The Application Server Alone

Status: Superseded by ADR-289 — its D1-D3 are D12, D13 and D16 there Date: September 23, 2026 Target Version: Nikaia 0.0.166 Narrows: ADR-194 D2 (the first of its two products) and D3’s operator half; ADR-038 §4.5’s order loses one step Related: ADR-194 D5 (the MVP’s protocol, which this leaves whole), ADR-069 D1 (http is a package), ADR-018 (what a handler is given and gives back), ADR-198 (the socket), ADR-199 (the readiness layer under it)

1. Context

ADR-194 answered who decides what is exposed by finding the question false: there are two products, and each is right about itself. The standard server — nikaia serve [dir] — has no author present at run time, so everything about it is the operator’s; an application that serves has an author who decided already.

That reasoning is not withdrawn. What has changed is the project’s own position: the MVP is behind schedule, and one of the two products is worth much less than the other.

2. Decisions

D1 — nikaia serve is cut.

There is no serve subcommand, and the standard file server is not a thing this project is going to build. The record that decided it stands; what is cut is the product, by the owner, for two reasons stated together:

A cut is written down, which is the whole of why this record exists. The alternative was to leave step 4 on a list where it would be read as not yet for as long as the list exists, and a step nobody intends to take is worse than an absent one: it makes the list wrong about what is coming rather than merely incomplete.

D2 — So the caps are the program’s, and there is no operator half.

ADR-194 D5 ends the limits are the operator’s in the first product and the program’s in the second. With the first product gone, the second clause is the whole sentence: body_cap, head_cap, head_wait and connections are options on http::listen, with defaults that are a server rather than a denial of service, and a program that wants others names only what it changes.

The same subtraction reaches D3. It binds to localhost, and anything wider is asked for was written for both products, and localhost was the fail-closed default because a standard server’s author is not there to choose. An application’s author is: http::listen(at) takes the address, the program says which, and there is no default to make safe. What D3 leaves behind is the --trust listing of a wide bind, which it named as belonging to ADR-108’s shape rather than to itself, and that is unaffected — a program that binds every interface is a thing a reviewer may want listed whether or not a serve command exists.

D3 — What replaces it is examples/hello-http/, and it is a real server.

The demonstration a reader needs is one address and one function, and that is what the example is: http::listen(at) fn(request) { … }, with the handler deciding. It used to render one response and print it, because there was nothing to hand a response to.

It is driven by a test over a real socket (crates/nikaia/tests/project.rs): port 0, the bound address read back off the line the server prints, and then the two methods, a body by Content-Length and each of the refusals asked of it in turn. That test is what serve would also have needed, and it is spent once here instead of twice.

3. Consequences

4. What this does not decide

This site is open source. Improve this page.