"The app door is loopback-only and has no public web service." — Tinker architecture
Three Kinds of Caller to Keep Out
An HTTP port on a Mac can be reached by more than the program you wrote it for. Another machine on the network, if the socket listens beyond loopback. A web page open in any browser on the same Mac — browsers will happily send requests to 127.0.0.1. And anything that arrives through a proxy, which can make a remote caller look local. Tinker's door is built to refuse all three, with checks at three layers that overlap wherever they can.
Layer One: the Listener
The listener binds to loopback and checks every request's Host header before routing. A loopback name with the listener's own port passes. Tinker also allow-lists the literal 127.0.0.1 at any port, deliberately: Pippa reaches a door through a forward that may present its own local port in Host, and refusing that would refuse her. The same layer refuses anything carrying a browser Origin header or Sec-Fetch-Site, which browsers attach to cross-site requests — so a web page cannot drive the door even though it is local. Bodies over 16 KiB are refused.
Layer Two: Tinker's Handler
Before routing, Tinker's own handler refuses any request that carries X-Forwarded-For, the header proxies add to say who the real client was: "Only local callers may use this door." Then it routes exactly three things: GET /health, GET /api/app-actions (the manifest) and POST /api/app-actions/<name>. Anything else is 404.
Layer Three: the Kit's Rule
Inside the worker, the kit's trusted_caller repeats the header checks in its own terms — no forwarding header, no Origin — before building the action registry. Its loopback test sees only the 127.0.0.1 the agent hands it, not the network peer, so keeping other machines out is the listener's job alone. And the kit's first refusal for any action is about who: an envelope whose actor kind is not pippa is refused with "this door is Pippa's; Dad's own screens write through their own routes." Dad does not need the door; he has the menu, his shortcuts and Settings.
/health Is the Exception That Proves It
The health route answers before any worker starts, without an actor, and it answers even when Tinker's saved state is held — "so a caller reads the reason instead of a refused connection." It reveals only whether the engine is up, the member name, the product version and the load problem if there is one. It changes nothing and lists nothing, which is what makes it safe to answer anyone the listener already admitted.