Skip to main content
Goal: add one operation to the API and use it from the web app, without any definition being written twice. The contract package is the source of truth. Everything else follows from it.

Notes

Do not define a TypeScript interface for a response. The registry entry is the type. A hand-written interface is a second source of truth that will drift.
Put behaviour in use cases, not controllers. A controller that contains a condition on business data cannot be reused by the seed script or a future job.
Last modified on October 6, 2026