"The web page you use isn't the product. It's the first customer of the product, standing in the same line as everyone else."
The Engine Is the Product
Loomis's product is the analysis engine and the HTTP API that fronts it. The web UI you click around in is not the thing itself — it's the first client of that API, and it holds no special privileges. When you analyze a portrait in the browser, the UI is making the same HTTP call any other client would make. This ordering — engine and API first, UI as a consumer — is the single most important structural decision in how the whole thing is built.
No Client Imports Internals
One rule enforces API-first and keeps it honest: no client reaches into the engine's internals. The UI cannot shortcut past the API to poke at engine state directly; it goes through the same public surface as everyone else. This matters because the moment one client gets privileged backdoor access, the API quietly becomes a second-class citizen — under-tested, under-designed, and eventually wrong. Forbidding the shortcut is what keeps the API the real, load-bearing interface rather than a decorative one.
The Test of API-First
Here's the clean test you can apply to any tool: could it lose its entire UI and still be fully usable through its API? If yes, it's genuinely API-first; if no, the UI is secretly holding logic hostage. Loomis passes cleanly. Its command-line tools analyze a portrait, a pose, a hand, or an object with no UI in the loop at all, and the future Cinder panel will consume the very same engine. The web interface is a convenience on top, never a dependency underneath.
Why This Beats UI-First
A UI-first tool hides its logic inside the interface, which feels faster to build and then charges interest forever. The instant you want a second client — a script, a CLI, another app — you have to perform extraction surgery to pry the logic out of the UI it was tangled into. API-first pays a small upfront cost (design the boundary deliberately) and buys multi-client support, testability, and scriptability from day one, at no later cost. It's the Bonfire pattern — engine owns the model, UI is the first client — and it's the family's default precisely because the cheap-feeling alternative is the expensive one.