Skip to content

Architecture

MLsuite is three applications run as one product: a React client, a Spring Boot API and a Python runtime, with PostgreSQL for state and MinIO for files.

The browser calls nginx, which serves the React app and proxies /api to the Spring API. The API stores state in PostgreSQL and model files in MinIO, sends artifacts and inputs to the Python runtime, and reads Docker Compose through the operations agent. Browserpeople, softwarefrontendnginx · Reactspring-appauth · permissions · statepy-analyzerload · predict · explainpostgresapplication stateminiomodel filesops-agentDocker ComposeHTTPS/apiHTTP
The Compose services. Only frontend (and PostgreSQL's port) is published on the host.
Part Owns
React client (frontend/) Forms drawn by MLform from the schema, the session of unsaved runs, review and export screens. It shows what the API returns.
Spring API (api/) Accounts, sessions, organizations and permissions; models, schemas, bookmarks, inferences, reviews, plugins and API clients; public pages and the client API. It is the only service that stores anything.
Python runtime (backend/) Loading and verifying .mlbundle files, coercing inputs, predicting and explaining. It keeps no state besides a small cache of verified bundles.
PostgreSQL All application state. Flyway migrations own its schema.
MinIO Model and plugin files in a versioned bucket; models are stored under their hash.
Operations agent (ops-agent/) Service health, logs, controls and shells for the Infrastructure page, read from Docker Compose.
  1. The browser draws the bookmark’s snapshot as a form and sends the answers to the API.
  2. The API checks the session and the member’s permissions, resolves the bookmark to its snapshot and bound models, and sends each model’s artifact and record to the runtime.
  3. The runtime loads the bundle, verifies it, converts the record to the model’s features and predicts.
  4. The API returns each model’s result. When the run is saved, it stores the inputs, every result, the snapshot and the bookmark as one inference.
  5. Reviews, exports and the Inferences table all read that stored inference, so they always agree on which model and form produced it.

Public pages and the client API follow the same path without a session: the API serves only published or granted bookmarks, applies their run limits, and stores each run as the organization’s inference with its origin.

The API contract is described in api/openapi.json in the repository.