Skip to main content

Context

Every DAM ships an API, and in every one the API trails the app: the app reaches the database through routes nobody else may call, and the public API gets what someone remembered to expose. Agents and scripts are second-class by construction.

Decision

The web UI calls /api/v1 and nothing else, beside signing in at /api/auth. There are no private endpoints. If the app needs something the API can’t do, the API isn’t finished, and it is extended in the same change.

Consequences

  • Anything a person can do, a key can do, at the scope it holds.
  • Every feature costs an API design first, which is slower for the first version of it and cheaper for every version after.
  • The OpenAPI spec is complete by construction: a test fails when a route exists that the spec doesn’t describe.
  • Server-rendered pages that only read (the app’s first paint) still go through lib/core, never a query of their own.