From 806f5c453a1be12ec3d235a5c8fbb26f876762fa Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Wed, 13 May 2026 15:02:03 +0000
Subject: [PATCH 01/23] Remove legacy v1 docs entirely
---
.../getting-started/authentication.mdx | 100 ----
.../building-the-bailo-image.mdx | 21 -
.../configuration/app-configuration.mdx | 48 --
.../configuration/making-a-schema.mdx | 222 --------
.../getting-started/helm-deployments.mdx | 63 ---
.../isolated-network-deployment.mdx | 39 --
.../administration/migrations/bailo-0.4.mdx | 120 -----
.../administration/migrations/bailo-2.0.mdx | 26 -
.../pages/docs/v1/developers/contributing.mdx | 41 --
.../pages/docs/v1/developers/dev-notes.mdx | 23 -
.../pages/docs/v1/developers/dev-setup.mdx | 50 --
.../main-concepts/building-models.mdx | 139 -----
.../developers/main-concepts/logical-flow.mdx | 28 -
.../processes/adding-an-endpoint.mdx | 78 ---
.../v1/developers/testing/e2e-testing.mdx | 108 ----
.../v1/developers/testing/manual-testing.mdx | 28 -
.../v1/developers/testing/unit-testing.mdx | 56 --
.../docs/v1/developers/useful-commands.mdx | 105 ----
frontend/pages/docs/v1/directory.tsx | 138 -----
.../docs/v1/errors/duplicate-version.mdx | 14 -
frontend/pages/docs/v1/index.mdx | 70 ---
.../pages/docs/v1/users/approvals/index.mdx | 50 --
.../v1/users/automation/key-workflows.mdx | 56 --
.../v1/users/automation/python-client.mdx | 181 -------
.../automation/workflows/create-a-model.mdx | 75 ---
.../automation/workflows/edit-model-card.mdx | 63 ---
.../workflows/upload-new-version.mdx | 122 -----
.../docs/v1/users/deployments/compliance.mdx | 36 --
.../deployments/requesting-a-deployment.mdx | 31 --
.../deployments/using-a-deployment/docker.mdx | 60 ---
.../pages/docs/v1/users/marketplace/index.mdx | 17 -
.../v1/users/upload-a-model/model-wrapper.mdx | 480 ------------------
.../upload-a-model/preparing-the-code.mdx | 196 -------
.../v1/users/upload-a-model/requirements.mdx | 22 -
.../users/upload-a-model/updating-a-model.mdx | 16 -
.../users/upload-a-model/upload-to-bailo.mdx | 42 --
.../upload-a-model/why-upload-a-model.mdx | 51 --
37 files changed, 3015 deletions(-)
delete mode 100644 frontend/pages/docs/v1/administration/getting-started/authentication.mdx
delete mode 100644 frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx
delete mode 100644 frontend/pages/docs/v1/administration/getting-started/configuration/app-configuration.mdx
delete mode 100644 frontend/pages/docs/v1/administration/getting-started/configuration/making-a-schema.mdx
delete mode 100644 frontend/pages/docs/v1/administration/getting-started/helm-deployments.mdx
delete mode 100644 frontend/pages/docs/v1/administration/getting-started/isolated-network-deployment.mdx
delete mode 100644 frontend/pages/docs/v1/administration/migrations/bailo-0.4.mdx
delete mode 100644 frontend/pages/docs/v1/administration/migrations/bailo-2.0.mdx
delete mode 100644 frontend/pages/docs/v1/developers/contributing.mdx
delete mode 100644 frontend/pages/docs/v1/developers/dev-notes.mdx
delete mode 100644 frontend/pages/docs/v1/developers/dev-setup.mdx
delete mode 100644 frontend/pages/docs/v1/developers/main-concepts/building-models.mdx
delete mode 100644 frontend/pages/docs/v1/developers/main-concepts/logical-flow.mdx
delete mode 100644 frontend/pages/docs/v1/developers/processes/adding-an-endpoint.mdx
delete mode 100644 frontend/pages/docs/v1/developers/testing/e2e-testing.mdx
delete mode 100644 frontend/pages/docs/v1/developers/testing/manual-testing.mdx
delete mode 100644 frontend/pages/docs/v1/developers/testing/unit-testing.mdx
delete mode 100644 frontend/pages/docs/v1/developers/useful-commands.mdx
delete mode 100644 frontend/pages/docs/v1/directory.tsx
delete mode 100644 frontend/pages/docs/v1/errors/duplicate-version.mdx
delete mode 100644 frontend/pages/docs/v1/index.mdx
delete mode 100644 frontend/pages/docs/v1/users/approvals/index.mdx
delete mode 100644 frontend/pages/docs/v1/users/automation/key-workflows.mdx
delete mode 100644 frontend/pages/docs/v1/users/automation/python-client.mdx
delete mode 100644 frontend/pages/docs/v1/users/automation/workflows/create-a-model.mdx
delete mode 100644 frontend/pages/docs/v1/users/automation/workflows/edit-model-card.mdx
delete mode 100644 frontend/pages/docs/v1/users/automation/workflows/upload-new-version.mdx
delete mode 100644 frontend/pages/docs/v1/users/deployments/compliance.mdx
delete mode 100644 frontend/pages/docs/v1/users/deployments/requesting-a-deployment.mdx
delete mode 100644 frontend/pages/docs/v1/users/deployments/using-a-deployment/docker.mdx
delete mode 100644 frontend/pages/docs/v1/users/marketplace/index.mdx
delete mode 100644 frontend/pages/docs/v1/users/upload-a-model/model-wrapper.mdx
delete mode 100644 frontend/pages/docs/v1/users/upload-a-model/preparing-the-code.mdx
delete mode 100644 frontend/pages/docs/v1/users/upload-a-model/requirements.mdx
delete mode 100644 frontend/pages/docs/v1/users/upload-a-model/updating-a-model.mdx
delete mode 100644 frontend/pages/docs/v1/users/upload-a-model/upload-to-bailo.mdx
delete mode 100644 frontend/pages/docs/v1/users/upload-a-model/why-upload-a-model.mdx
diff --git a/frontend/pages/docs/v1/administration/getting-started/authentication.mdx b/frontend/pages/docs/v1/administration/getting-started/authentication.mdx
deleted file mode 100644
index b7f161dc9b..0000000000
--- a/frontend/pages/docs/v1/administration/getting-started/authentication.mdx
+++ /dev/null
@@ -1,100 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Authentication
-
-Bailo is intended to be run in multiple different environments, each of which will have their own standard
-authentication and authorisation methods. To enable this, Bailo exposes a class of methods that can be overridden to
-integrate with various services.
-
-By default, we expect the Bailo instance to be run behind a reverse proxy, which sets the following headers to identify
-users and their roles:
-
-- `x-userid` is a unique identifier for a user.
-- `x-email` is an optional email address (to send notifications).
-- `x-user` is a JSON encoded object containing any other user data.
-
-Within Nginx, these can be set via the `proxy_set_header` declaration:
-
-```bash
-proxy_set_header X-UserId "user";
-proxy_set_header X-Email "user@example.com";
-proxy_set_header X-User '{"some":"data"}';
-```
-
-To support other authentication mechanisms, an administrator can override the `getUserFromReq` method to get this
-information from any other method. To do this edit `backend/src/connectors/Authorisation.ts` to override the required
-methods from `backend/src/utils/AuthorisationBase.ts`. E.g.
-
-```javascript
-// backend/src/connectors/Authorisation.ts
-import AuthorisationBase from '../utils/AuthorisationBase.js'
-import { Request } from 'express'
-
-class Authorisation extends AuthorisationBase {
- async getUserFromReq(_req: Request) {
- const username = req.get('x-username')
-
- return {
- userId: username,
- email: await getUserEmail(username),
- data: await getUserData(username),
- }
- }
-}
-
-export default Authorisation
-```
-
-In the above example, instead of getting this data from headers passed into the application, we now get the username
-from headers and get the users email and data from another method.
-
-This is called on each request and not cached, so you may want to implement this yourself if you are using expensive
-cryptographic functions or making external network requests.
-
-# Authorisation
-
-By default Bailo protects models from deployment by requiring an approval by the model owner. Also, only the model owner
-is capable of editting a model that has been uploaded. All users can view all models uploaded to the system.
-
-This is unlikely to be suitable for large organisations, who may wish to integrate their own internal authorisation
-system into Bailo. An administrator can integrate with their internal authorisation system by overriding one of the
-`canUserSeeX` functions, visible in `backend/src/utils/AuthorisationBase.ts`. Each functino takes in a user object, as
-well as the object to view. The function is then expected to return either `true` or `false` depending on if the user
-can view that object.
-
-This authorisation affects both users directly viewing a model, as well as the models visible in the marketplace.
-
-An example authorisation implemention:
-
-```javascript
-// backend/src/connectors/Authorisation.ts
-import AuthorisationBase from '../utils/AuthorisationBase.js'
-import { UserInterface } from '../models/User.js'
-import { VersionDoc } from '../models/Version.js'
-
-class Authorisation extends AuthorisationBase {
- async getUserFromReq(_req: Request) {
- // we now include roles in the user object
- return {
- userId: 'user',
- data: { roles: ['alpha', 'beta', 'gamma'] },
- }
- }
-
- async canUserSeeVersion(user: UserInterface, model: VersionDoc) {
- // we can access the roles from the user document
- const userRoles = user.data.roles
- // our schema has a 'role' field we need users to have to see it
- const versionRole = version.metadata.authorisation.role
-
- // check if the user has the required role
- const canAccess = userRoles.includes(versionRole))
-
- return canAccess
- }
-}
-
-export default Authorisation
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx b/frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx
deleted file mode 100644
index 45cb0f1660..0000000000
--- a/frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx
+++ /dev/null
@@ -1,21 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Building the Bailo Image
-
-Bailo does not provide pre-built images. Building one yourself is easy! Two images should be produced, one for the
-frontend and one for the backend.
-
-```bash
-# Bailo uses a monorepo, so images should be built from the root directory
-$ docker build --build-context python=./lib/python -t "bailo-backend" -f ./backend/Dockerfile .
-$ docker build -t "bailo-frontend" -f ./frontend/Dockerfile .
-$ docker build -t "bailo-artefactscan" -f ./lib/artefactscan_api/Dockerfile .
-```
-
-Ensure you do not use the development stages in Dockerfiles (used by building with `--target dev`) as they expect the
-application to be mounted into them at a later point in time (to enable hot code reloading).
-
-`docker` can be swapped out for any other OCI compliant container build platform. We routinely test with both `podman`
-and `OpenShift Builder`. This image should be pushed to a registry that is accessible from your deployment target.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/administration/getting-started/configuration/app-configuration.mdx b/frontend/pages/docs/v1/administration/getting-started/configuration/app-configuration.mdx
deleted file mode 100644
index 4cc1b7398d..0000000000
--- a/frontend/pages/docs/v1/administration/getting-started/configuration/app-configuration.mdx
+++ /dev/null
@@ -1,48 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# App Configuration
-
-## Configuration Files
-
-Bailo uses [`node-config`](https://github.com/node-config/node-config#readme) for application configuration.
-`node-config` organizes hierarchical configurations, allowing the user to set a series of overides over a base
-configuration.
-
-The default set of configuration can be found in `config/default.js`, with overrides for other environments included in
-the same folder. For production environments, configuration should be placed in either `production.cjs` or `local.js` to
-override the default configuration.
-
-The full order of configuration inheritance can be found
-[on the node-config wiki](https://github.com/node-config/node-config/wiki/Configuration-Files).
-
-Given the following set of files:
-
-```javascript
-// default.js
-{ a: 5, b: "ten", c: { d: 20, e: 25 } }
-
-// production.cjs
-{ b: 10, c: { d: "d" } }
-
-// local.js
-{ c: { d: 999 } }
-```
-
-The result is:
-
-```javascript
-{
- a: 5, // no overrides
- b: 10, // overridden in production.cjs
- c: {
- d: 999, // overriden in production.cjs, then again in local.js
- e: 25 // not overwritten, objects are merged together.
- }
-}
-```
-
-When deploying using `helm`, configuration is primarily handled through `values.yaml` controlling
-`helm/bailo/templates/bailo/bailo.configmap.yaml`. Configuration is loaded when the application starts. The application
-must be restarted when configuration changes.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/administration/getting-started/configuration/making-a-schema.mdx b/frontend/pages/docs/v1/administration/getting-started/configuration/making-a-schema.mdx
deleted file mode 100644
index 4fdd708d31..0000000000
--- a/frontend/pages/docs/v1/administration/getting-started/configuration/making-a-schema.mdx
+++ /dev/null
@@ -1,222 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Creating and Uploading schemas
-
-Bailo makes use of the [RJSF](https://react-jsonschema-form.readthedocs.io/en/latest/) (react-jsonschema-form) library
-in order to dynamically create its upload & deployment forms. These forms can be constructed of various existing
-widgets, or even use custom widgets defined in Bailo.
-
-## Example / minimal schemas
-
-Bailo includes both an example schema for uploads and for deployments. You can find them in
-`backend/src/scripts/example_schemas`. It is important to note that these schemas contain all of mandatory fields that
-the application needs in order to run. These fields are hard-coded in various places in the source code.
-
-## Create a schema
-
-### Simple questions
-
-A typical object inside the schema will look like this:
-
-```json
-"firstName": {
- "type": "string",
- "title": "First name",
- "default": "Chuck",
- "description": "This is for your first name"
-}
-```
-
-The type property can be altered depending on what value you want the question to return. The title property will be
-displayed as the question itself, and the description will appear under the question to include any additional
-information that might help the user. Please note that if you do not include a title property, the library will use the
-name of the object (in this case firstName) instead.
-
-### Dates
-
-Dates can be added like this:
-
-```json
-"date": {
- "type": "string",
- "title": "Date of birth",
- "format": "date"
-}
-```
-
-### Sections
-
-When using Bailo you will see that the upload form is made up of a number of pages. Each page is a separate object
-inside the first "properties" property of the schema. For example:
-
-```json
-"properties": {
- "firstPage": {
- "type": "object",
- "title": "Page 1",
- "properties": {
- ...
- }
- },
- "secondPage": {
- "type": "object",
- "title": "Page 2",
- "properties": {
- ...
- }
- }
-}
-```
-
-Creating sub-sections works identically to how we defined our pages above. If we take the first page of our example
-above, and then amend it so it looks like this:
-
-```json
-"properties": {
- "firstPage": {
- "type": "object",
- "title": "Page 1",
- "properties": {
- "sectionOne": {
- "type": "object",
- "title": "Section 1"
- "properties": {
- "questionOne": {
- "type": "number",
- "title": "Enter a number",
- }
- }
- },
- "sectionTwo": {
- "type": "object",
- "title": "Section 2"
- "properties": {
- "questionTwo": {
- "type": "string",
- "title": "Enter a string",
- }
- }
- }
- },
- ...
-}
-```
-
-#### Hiding sections from the model card
-
-Sections will display on the model card page by default, but in the case whereby a section needs to be hidden from the
-model card, then add the following property:
-
-```json
-"myPage": {
- "title": "Page 1",
- "type": "object",
- "properties": {
- ...
- },
- "displayModelCard": false,
-}
-```
-
-Note: This will only hide it from the model page, the data will still persist in the version metadata.
-
-### Dependencies
-
-A dependency is useful when the answer to one question might warrant some additional information; for example, a boolean
-question might not need a detailed response if the answer is 'no', but if the user answer is 'yes' you might want to ask
-them for some additional details.
-
-To avoid validation errors, Bailo schema dependencies need to be handled slightly differently to the ones provided in
-the RJSF documentation. Here is an example of how we handle dependencies for Bailo schemas:
-
-```json
-"myPage": {
- "title": "Page 1",
- "type": "object",
- "properties": {
- "questionOne": {
- "type": "boolean",
- "title": "True or false?",
- },
- "questionTwo": {
- "title": "More information please!",
- "type": "string",
- }
- },
- "dependencies": {
- "questionOne": {
- "oneOf": [
- {
- "properties": {
- "questionOne": {
- "enum": [false],
- "readOnly": false
- },
- "questionTwo": {
- "readOnly": true
- }
- },
- "required": ["questionOne"],
- "additionalProperties": false
- },
- {
- "properties": {
- "questionOne": {
- "enum": [true],
- "readOnly": false
- },
- "questionTwo": {
- "readOnly": false
- }
- },
- "required": ["questionOne", "questionTwo"],
- "additionalProperties": false
- }
- ]
- }
- },
- "required": ["questionOne"]
-}
-```
-
-Inside `dependencies` we have defined a case of only having one of two different situations. Firstly, if `questionOne`
-is set to `false`, then `questionTwo` will be set to read only, whereas if we set `questionOne` to `true` then
-`questionTwo` will not be set as read only. This method might seem slightly more convoluted than the documentation
-online, but it allows for answers to be changed without making the schema invalid. The current design of RJSF's
-dependencies works as so:
-
-- User selects `true` for `questionOne`
-- User enters data into `questionTwo`
-- User changes their mind and selects `false` for `questionOne`
-- User data for `questionTwo` remains in the form data, despite not being visible on the form itself
-
-This behaviour is so that any user data is retained in case the user wishes to select `true` for `questionOne` again.
-From a user perspective this nice as it means there is less chance of data being lost when changing answers, but it does
-have a knock-on affect whereby in certain situations it will make the schema fail validation. Our approach is set the
-additional questions to read only when they are not in use. The downside to this approach is that we potentially include
-unwanted additional data, but this can be removed by the user if this happens.
-
-## Uploading a schema
-
-There are two ways of uploading a schema to Bailo. The first is by manually adding it to the `schemas` collection in
-Mongo directly, or, by using the addUploadSchemas.ts / addDeploymentScript.ts scripts found within
-`backend/src/scripts`. This process is not currently very graceful and requires some minor editing of the scripts
-themselves.
-
-First, you will need to change the import at the top of the file so that it points to your new schema, and not the
-minimal schema. Next, where we call `createSchema()` you will need to amend the supplied parameters of `name` and
-`reference` as Mongo will not accept multiple schemas with the same name or reference.
-
-Once this script has been changed, run:
-
-```bash
-npm run script -- addUploadSchema
-```
-
-Or for deployments:
-
-```bash
-npm run script -- addDeploymentSchema
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/administration/getting-started/helm-deployments.mdx b/frontend/pages/docs/v1/administration/getting-started/helm-deployments.mdx
deleted file mode 100644
index 3e5a991a3c..0000000000
--- a/frontend/pages/docs/v1/administration/getting-started/helm-deployments.mdx
+++ /dev/null
@@ -1,63 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Helm Deployments
-
-> At the moment `helm/bailo` is configured for OpenShift deployment, our default deployment target. Support for
-> Kubernetes is on the way. We have heard that external organisations have had success already by disabling 'routes' and
-> setting 'ingresses' instead.
-
-## Requirements
-
-- [HELM CLI](https://github.com/helm/helm/releases)
-- [Kubectl](https://kubernetes.io/docs/tasks/tools/)
-
-### Optional
-
-OC is required for deployments to OpenShift
-
-- [OpenShift CLI](https://mirror.openshift.com/pub/openshift-v4/clients/oc/latest/linux/oc.tar.gz)
-
-## Deployment
-
-### Setup
-
-All commands assume they are run in the `helm/bailo` directory. The user should have already authenticated `kubectl` to
-their cluster and changed to the correct context:
-
-1. `kubectl config set-context --current --namespace=bailo`
-
-To deploy to `OpenShift`, `oc` must also be configured correctly.
-
-### Configuration
-
-Deployment options can be overridden by including a `--values ` to a Helm command, or by
-using `--set =`.
-
-We do not host built images of Bailo, thus at the very minimum the configuration should include the location of a Bailo
-image:
-
-```yaml
----
-image:
- repository: some.repository.com/bailo
- tag: 'latest'
-```
-
-This image can be built with `docker build -t bailo .` in the root directory. This guide assumes the overrides file is
-called `local.yaml` in the `helm/bailo` folder.
-
-#### Installing Bailo
-
-1. `helm dependency update`
-2. `helm install --values ./local.yaml bailo .`
-3. `helm list # list current deployments`
-
-#### Upgrading Bailo
-
-1. `helm upgrade --values ./local.yaml bailo .`
-
-#### Removing Bailo
-
-1. `helm uninstall bailo`
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/administration/getting-started/isolated-network-deployment.mdx b/frontend/pages/docs/v1/administration/getting-started/isolated-network-deployment.mdx
deleted file mode 100644
index 12dd9e3282..0000000000
--- a/frontend/pages/docs/v1/administration/getting-started/isolated-network-deployment.mdx
+++ /dev/null
@@ -1,39 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Isolated Network Deployment
-
-## Helm
-
-We rely on the following Bitnami charts:
-
-- MinIO https://charts.bitnami.com/bitnami
-- MongoDB https://charts.bitnami.com/bitnami
-
-## Docker
-
-We rely on the following images:
-
-- node
-- registry
-- seldon/seldon-core-s2i-python37
-- marlonb/mailcrab
-- nginxinc/nginx-unprivileged
-
-## NPM
-
-We rely on many NPM packages. The list is available within `package-lock.json`. Most are standard packages with the
-exception of:
-
-- `selenium-webdriver`, which powers our integration tests and downloads `firefox` from the internet.
-- `sharp`, which is an optimised image transformer and requires some compilation tools.
-
-Both are optional and can be removed with:
-
-```bash
-npm remove selenium-webdriver sharp
-```
-
-Detailed instructions for building `sharp` on various platform is available on the
-[installation page](https://sharp.pixelplumbing.com/install).
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/administration/migrations/bailo-0.4.mdx b/frontend/pages/docs/v1/administration/migrations/bailo-0.4.mdx
deleted file mode 100644
index b46bfa4bf0..0000000000
--- a/frontend/pages/docs/v1/administration/migrations/bailo-0.4.mdx
+++ /dev/null
@@ -1,120 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-## Bailo Migration to v0.4
-
-Whilst Bailo v0.4 does not introduce any database or major code changes, it does feature a reorganisation of the
-project. Instead of the existing format where we had a single 'app', we now split it into two images:
-
-- frontend
-- backend
-
-The frontend section handles rendering the UI. When run in production, it is entirely statically built, simply sending
-raw HTML files to the user. The backend handles all API requests and provides the interactivity of the service.
-
-The code originally in `server` is now stored in the `backend` folder.
-
-### Turbo
-
-To handle multiple repositories, we now use the `turborepo` build system. It provides us with high performance and
-reproducible builds, only compiling what has changed since the last compilation. The monorepo is comprised of 'apps':
-
-- frontend
-- backend
-
-And libraries:
-
-- lib/shared
-- lib/p-mongo-queue
-- lib/node
-
-These are each individual npm packages, with their own `package.json` files, scripts and more. A script can be run in
-individual repositories by using `--workspace`, or in all by omitting it:
-
-```bash
-# From the root directory
-
-# Will run only in the 'backend' app
-npm run script -- exampleSetAllSchemas
-# Will run in all packages, both apps and libraries
-npm run style
-```
-
-Most commands, like `npm install` will default to running in all workspaces. This allows you to run `npm install` a
-single time in the root directory and it will install all dependencies across all applications.
-
-Workspaces is a standard NPM function, read more about it on the
-[Workspaces page](https://docs.npmjs.com/cli/v7/using-npm/workspaces). In addition, the `turbopack` docs can be found
-[here](https://turbo.build/repo/docs).
-
-### ESM
-
-The 'backend' application now runs entirely as ESM. This requires a modern NodeJS version, at least v14+. Some changes
-are also made to how tests are written. Specifically, to mock dependencies there is now a need to mock the dependency
-_first_ using `unstable_mockModule` and then dynamically import it:
-
-```javascript
-const version = await import('../../services/version.js')
-jest.unstable_mockModule('../../services/version.js', () => {
- return {
- ...version,
- findVersionByName: jest.fn(),
- }
-})
-
-const { findVersionByName } = await import('../../services/version.js')
-```
-
-There is an intention to possibly switch to an alternative test runner to alleviate this issue (e.g. Vitest). More can
-be read on how Jest works with ESM [here](https://jestjs.io/docs/ecmascript-modules). No other changes should be seen
-within the application, beyond imports requiring a `.js` ending. We have `esModuleInterop` enabled, which should mean we
-remain compatible with both old and new packages.
-
-#### What is ESM?
-
-ESM, or ECMEAScript Modules, is the latest standard for packaging / modularising JS code, as opposed to CJS, or Common
-JavaScript. ESM has a number of benefits that include nicer import/export syntax, better code reusability, and also the
-ability to import modules asynchronously.
-
-For more information about ESM, we recommend visiting:
-
-- [nodejs.org](https://nodejs.org/api/esm.html)
-- [webpack.js.org](https://webpack.js.org/guides/ecma-script-modules/)
-
-### Helm
-
-To support running two containers, minor changes have been made to our `helm` charts. These changes add a new 'frontend'
-container, which requires no environment variables / setup. All traffic should route to the frontend container EXCEPT:
-
-- `/api`, which should be sent to the backend container.
-- `/v2`, which should be sent to the Docker registry.
-
-The backend environment variables / mount locations remain unchanged. The frontend serves static files, so requires
-minimal setup.
-
-The helm folder has changed, it is now stored in `infrastructure/helm`, this change was made to allow other deploy
-methods.
-
-### Config
-
-We've taken the time to reduce the number of duplicate configuration options we have, and try to standardise the
-existing values. If you are using a service such as helm, you may not need to make any changes.
-
-The configuration is now also labelled to help advise on what each setting changes. Some major changes:
-
-- `minio` connection options are now stored under `minio.connection` and passed directly to the `minio` library.
-- `minio.uploadBucket` is now called `minio.buckets.uploads`
-- `minio.registryBucket` is now called `minio.buckets.registry`
-- `minio.createBuckets` is now called `minio.automaticallyCreateBuckets`
-
-- `smtp` connection options are now stored under `smtp.connection` and passed directly to the `node-mailer` library.
-
-- `s2i.builderImage` has been moved to `ui.seldonVersions` and is now an array of names and images. These are to allow
- users to select the correct Seldon version to build from
-
-- `openshift.appPublicRoute` is removed in favour of `app.protocol`, `app.host` and `app.port`
-- `openshift` is now under `build.openshift`.
-- `uiConfig` is now `ui`
-
-- `listen` has been split into `app.port` for the frontend and `api.port` for the backend
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/administration/migrations/bailo-2.0.mdx b/frontend/pages/docs/v1/administration/migrations/bailo-2.0.mdx
deleted file mode 100644
index 63d7c27eac..0000000000
--- a/frontend/pages/docs/v1/administration/migrations/bailo-2.0.mdx
+++ /dev/null
@@ -1,26 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-## Bailo Migration to v2.0
-
-Bailo v2 is a complete rewrite of all aspects of the model management platform in order to meet modern demands. To try
-to make the migration as easy as possible, Bailo can simultaneously run V1 and V2, allowing you to schedule the
-migration over time.
-
-No architecture has significantly changed. We still require two application containers (frontend and backend), a
-registry container and an nginx routing container. We also continue to store all data in:
-
-- MongoDB for all metadata storage.
-- An S3 compatible platform for all binary storage.
-
-Whilst storage methods remain the same, all tables and keys are unique between V1 and V2 which allows for simultaneously
-running multiple versions:
-
-- All MongoDB collections are now prefixed with `v2_`
-- The registry now uses `model_id` as a namespace, instead of either `internal` or `deployment_id`.
-- Models are now kept within the `beta` s3 path.
-
-Bailo provides the `migrateV2` script, which can be run in order to convert existing models from the older format to the
-new system. Users who do not use the default schemas will have to implement their own conversion functions. See the
-`MODEL_SCHEMA_MAP` and `DEPLOYMENT_SCHEMA_MAP` for simple schema migration examples.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/contributing.mdx b/frontend/pages/docs/v1/developers/contributing.mdx
deleted file mode 100644
index 7e1376fb0a..0000000000
--- a/frontend/pages/docs/v1/developers/contributing.mdx
+++ /dev/null
@@ -1,41 +0,0 @@
-### Contributing
-
-If you’re looking for an existing issue to help with, check out the
-[help wanted tickets](https://github.com/gchq/bailo/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) on GitHub.
-If you see any that you’re interested in working on, comment on it to let everyone know you’re working on it. If there’s
-no ticket for what you want to contribute, start a [new issue](https://github.com/gchq/bailo/issues) to discuss whether
-it follows the aims of this project. We ask this even for bugs, as there may be multiple solutions to be considered.
-
-Prior to us accepting any work, you must sign the [GCHQ CLA Agreement](https://cla-assistant.io/gchq/Bailo). We follow a
-branching strategy for handling contributions:
-
-1. Fork the Project
-2. Create your Feature Branch (`git checkout -b feature/new_thing`)
-3. Commit your Changes (`git commit -m 'Add a new thing'`)
-4. Push to the Branch (`git push origin feature/new_thing`)
-5. Open a Pull Request
-
-#### Pull Request Checklist
-
-This is a list of steps you should make prior to making a pull request
-
-##### Pre Coding
-
-- Make sure the PR links to an issue.
-- Sign the CLA ([GCHQ CLA Agreement](https://cla-assistant.io/gchq/Bailo))
-
-##### Post Coding
-
-- `npm run style` (code format)
-
- You can install [pre-commit](https://pre-commit.com/#install) and run `pre-commit install` in the project root to have
- this done automatically.
-
-- `npm run lint` (eslint checker)
-- `npm run build` (ensure code can be built)
-- `npm run test` (unit tests)
-- Manual testing of feature (in lieu of automated tests temporarily)
-
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/dev-notes.mdx b/frontend/pages/docs/v1/developers/dev-notes.mdx
deleted file mode 100644
index dd905ab000..0000000000
--- a/frontend/pages/docs/v1/developers/dev-notes.mdx
+++ /dev/null
@@ -1,23 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Developer Notes
-
-A quick list of things that developers think of when coding.
-
-- Never use `console.log` on the server, always use `logger` from utils.
-- Always run `npm run build` to check your types are valid across the project.
-- Don't run `npm run build` and `npm run dev` simultaneously.
-- VS: Code TypeScript messing around? Try `Ctrl + Shift + P` -> `Typescript: Restart TS Server`
-- Never respond with status codes, instead `throw BadReq` and let the error handler sort it.
-
-## Remote Debug (Visual Studio Code)
-
-Remote debug has been configured to enable developers to start a debug session that is connected to a running Bailo
-container. To use Remote Debug in VS Code navigate to 'Run and Debug', select 'Docker: Attach to Node' and press the
-green triangle icon. Developers can use debugging tools as they would if the application was running in VS Code. For
-example, inserting breakpoints, stepping through code and inspecting the variable explorer.
-
-Remote Debug has been configured for the local development environment via the 'docker-compose-dev' and is running on
-port '9229'.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/dev-setup.mdx b/frontend/pages/docs/v1/developers/dev-setup.mdx
deleted file mode 100644
index 9c9281ae45..0000000000
--- a/frontend/pages/docs/v1/developers/dev-setup.mdx
+++ /dev/null
@@ -1,50 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Developer Setup
-
-Bailo is designed to be developed within a Docker-Compose network that consists of all Bailo dependencies as well as a
-live-updating application pod. The developer setup requires the following to run:
-
-- [NodeJS](https://nodejs.org/en/download/)
-- [Docker](https://docs.docker.com/get-docker/)
-- [Docker Compose](https://docs.docker.com/compose/install/other/)
-
-We currently require the use of the standalone docker-compose executable, instead of the plugin. This is due to buildkit
-support not being complete in the plugin yet.
-
-Once the dependencies are installed, run the application with the following steps:
-
-```bash
-# Clone the Bailo repository locally
-git clone https://github.com/gchq/Bailo.git && cd Bailo
-
-# Install dependencies. This is optional, but makes future Docker builds faster.
-npm install
-
-# Create some development certificates, required for the registry and application.
-npm run certs
-
-# Start up the docker-compose stack, altering the UID to allow live reloading.
-sed "s/user_id=REPLACE_WITH_UID/user_id=$UID/" docker-compose-dev.yml > docker-compose-dev-personal.yml
-docker-compose -f docker-compose-dev-personal.yml up --force-recreate --build -d
-```
-
-On first run, it may take a while (perhaps 30 seconds) to start up. It needs to build several hundred TypeScript
-modules. Future starts only require a few seconds, as the modules are cached. There's also `npm run dev2` for an
-alternative type checker that is more rigorous. You should access the site via [localhost:8080](http://localhost:8080)
-which provides authentication as a test user.
-
-The development environment starts the following services:
-
-| Service | Host | Notes |
-| ------------ | ----- | ---------------------- |
-| NodeJS App | 3000 | Internal app port |
-| Nginx | 8080 | Access the UI via this |
-| Mongo | 27017 | No credentials |
-| Registry | 5000 | HTTPS only, no UI |
-| Minio UI | 9001 | minioadmin:minioadmin |
-| Minio | 9000 | minioadmin:minioadmin |
-| Maildev Web | 1080 | View emails sent |
-| Maildev SMTP | 1023 | Fake mail server |
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/main-concepts/building-models.mdx b/frontend/pages/docs/v1/developers/main-concepts/building-models.mdx
deleted file mode 100644
index 44b021227a..0000000000
--- a/frontend/pages/docs/v1/developers/main-concepts/building-models.mdx
+++ /dev/null
@@ -1,139 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import bailoFlowChartBuild from 'public/docs/bailo_flowchart_build.png'
-
-# Building Models
-
-
-
-
-
-One of Bailo's responsibilities is turning a raw model into a packaged and productionised image for deployments. This
-process differs based on packaging method and build environment, but is always controlled by the `BuildHandler`.
-
-The `BuildHandler` takes a series of steps and handles running them, tidying up after or rolling back in the case of
-failure. The `BuildHandler` is not responsible for retrying failed steps, which is handled by the underlying `Queue`.
-
-Upon completion, the build is marked as complete and returned. In the case of a failure, the model will retry until the
-retry limit is reached, where it will fail.
-
-## Build Handler
-
-The `BuildHandler` is constructed with a static series of steps to carry out:
-
-```typescript
-const buildHandler = new BuildHandler([
- { construct: exampleTaskA() },
- { construct: exampleTaskB() },
- { construct: exampleTaskC() },
-])
-```
-
-Each `construct` is a function that takes in some options and returns a factory for an instantiated class extending
-`BuildStep`. An example `construct` is:
-
-```typescript
-function exampleTaskA(opts: Partial = {}) {
- return (logger: BuildLogger, props: ExtractFilesProps) => {
- return new ExampleTaskA(logger, opts, props)
- }
-}
-```
-
-A `BuildStep` represents a single unit of work. It needs a string `name`, used in the logs. It also needs a `build`
-function to run the work and a `rollback` function in case of failure. An optional `tidyUp` function can be provided to
-clean up after your operations.
-
-```typescript
-export abstract class BuildStep {
- constructor(logger: BuildLogger, opts: Partial, props: any) => BuildStep
-
- abstract name(version: VersionDoc, files: Files, state: any): Promise
- abstract build(version: VersionDoc, files: Files, state: any): Promise
- abstract rollback(version: VersionDoc, files: Files, state: any): Promise
-
- // optional tidy up
- async tidyUp(_version: VersionDoc, _files: Files, _state: any): Promise {}
-}
-```
-
-A `BuildStep` also takes in props which can be provided when creating the `BuildHandler`:
-
-```typescript
-const buildHandler = new BuildHandler([
- { construct: createFolder(), props: { folderPath: '/tmp/a' } },
- { construct: buildModel(), props: { image: 'seldon3.6' } },
-])
-```
-
-This can be used for configuring existing constructs. Once a `BuildHandler` is configured, it can be run by calling
-`.process()`:
-
-```typescript
-await buildHandler.process(version, files)
-```
-
-`files` is used to reference to any build artefacts required by the build process. It is an object of named files, e.g:
-
-```typescript
-{
- binary: {
- path: "/binary.zip",
- bucket: "uploads",
- name: "binary.zip"
- },
- code: {
- path: "/code.zip",
- bucket: "uploads",
- name: "code.zip"
- }
-}
-```
-
-## Seldon Core
-
-Seldon Core is a framework that allows machine learning models to be run on orchestration platforms like Kubernetes and
-OpenShift. It takes a model, a requirements files and an interface and returns a fully productionised Docker Image.
-
-This Docker Image runs multiple model instances in parallel behind a load balancer to enable both fault tolerance as
-well as performance improvements. It also provides both HTTP and GRPC interfaces as well as an OpenAPI specification to
-document them.
-
-We do not build images with SeldonCore on any platform. The default Seldon builder requires access to a Docker daemon
-which either does not exist or we have disabled for security reasons on every production deployment we support.
-
-Instead, when building an image we:
-
-1. Configure `s2i` by creating a `.s2i/environment` file containing:
-
-```bash
-MODEL_NAME=Model
-API_TYPE=REST
-SERVICE_TYPE=MODEL
-PERSISTENCE=0
-PIP_NO_CACHE_DIR=off
-INCLUDE_METRICS_IN_CLIENT_RESPONSE=false
-```
-
-2. Run `s2i` with the `--as-dockerfile` tag, which forces it to only generate a `Dockerfile` and not attempt to build an
- image.
-
-3. Build and push the generated `Dockerfile` using another tool. Currently supported include:
- - OpenShift Builder
- - img
-
-## img
-
-The default build tool for Bailo is [img](https://github.com/genuinetools/img). It mirrors the CLI syntax of `docker`
-but runs as a standalone, daemonless and unprivileged executable.
-
-## OpenShift Builder
-
-We use OpenShift Builder when running within OpenShift, which by default disables certain system calls required by
-`img`. This process currently comes with drawbacks, specifically:
-
-- Unable to see live logs of models being built.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/main-concepts/logical-flow.mdx b/frontend/pages/docs/v1/developers/main-concepts/logical-flow.mdx
deleted file mode 100644
index fac3dfb28b..0000000000
--- a/frontend/pages/docs/v1/developers/main-concepts/logical-flow.mdx
+++ /dev/null
@@ -1,28 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import bailoMMDiagram from 'public/mm-diagram.png'
-
-# Logical Project Flow
-
-{/* TODO: fix to use improved theme when available */}
-
-
-
-
-
-1. A user accesses a URL. We use [NextJS routing](https://nextjs.org/docs/routing/introduction) to point it to a file in
- `pages`. `[xxx].tsx` files accept any route, `xxx.tsx` files allow only that specific route.
-2. Data is loaded using [SWR](https://swr.vercel.app/). Data loaders are stored in `./data`. Each one exposes variables
- to specify if it is loading, errored, data, etc.
-3. Requests to the backend get routed through [express](https://expressjs.com/) within `backend/src/index.ts`. Each
- route is an array with all items being middleware except the last, which is the handler (`[...middleware, handler]`).
-4. Routes interact with the database via `mongoose`, which stores models in `./backend/src/models`.
-
-Some processing is done away from the main thread, when it is expected to take longer than a few milliseconds. These are
-posted to a `mongodb` queue and processed by handlers in the `backend/src/processors` folder. Mongodb queues are handled
-invisibly by `p-mongo-queue` (`backend/src/utils/queues.ts`).
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/processes/adding-an-endpoint.mdx b/frontend/pages/docs/v1/developers/processes/adding-an-endpoint.mdx
deleted file mode 100644
index 4d6496b7b1..0000000000
--- a/frontend/pages/docs/v1/developers/processes/adding-an-endpoint.mdx
+++ /dev/null
@@ -1,78 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Adding an Endpoint
-
-Checklist for adding an endpoint to Bailo:
-
-1. Define your route in `backend/src/routes/v1/.ts`:
-
-```typescript
-import { NextFunction, Request, Response } from 'express'
-
-export const echoRequest = [
- // each item in this list is middleware
- (req: Request, res: Response, next: NextFunction) => {
- // do nothing, call next to go to next middleware
- next()
- }
-
- // ensureUserRole can be used to check a user is logged in
- ensureUserRole('user'),
-
- // actual route handler
- async (req: Request, res: Response) => {
- if (!req.query.message) {
- // throw an error, more in backend/src/utils/result.ts
- // first argument is server-only log data, second argument is user facing message
- throw BadReq({}, 'No message provided')
- }
-
- // most logic here should be in a service
-
- // in this example we're just returning the data given to us
- res.json({
- message: req.query.message
- })
- },
-]
-```
-
-2. Add the route to the router to `backend/src/routes.ts`:
-
-```typescript
-import { getEcho } from './routes/v1/admin.js'
-
-server.get('/api/v1/echo', ...getEcho)
-```
-
-3. Add tests in `backend/src/routes/v1/.spec.ts`:
-
-```typescript
-describe('test echo route', () => {
- test('we get an echo', async () => {
- const res = await authenticatedGetRequest('/api/v1/echo?message=hello')
- expect(res.body.message).toBe('hello')
- })
-})
-```
-
-4. Document the endpoint using OpenAPI in `backend/src/routes/v1/specification.ts`
-5. Create a UI binding in `data/.ts`:
-
-```typescript
-import useSWR from 'swr'
-import { fetcher } from '../utils/fetcher.js'
-
-export function useEcho(message: string) {
- const { data, error, mutate } = useSWR<{ message: string }>(`/api/v1/echo?message=${message}`, fetcher)
-
- return {
- mutateEcho: mutate,
- message: data ? data.message : undefined,
- isEchoLoading: !error && !data,
- isEchoError: error,
- }
-}
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/testing/e2e-testing.mdx b/frontend/pages/docs/v1/developers/testing/e2e-testing.mdx
deleted file mode 100644
index 072c7a85e5..0000000000
--- a/frontend/pages/docs/v1/developers/testing/e2e-testing.mdx
+++ /dev/null
@@ -1,108 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# End to End Testing
-
-In order to test that Bailo is working correctly we make use of the [Cypress](https://www.cypress.io/) testing library.
-Much like Jest, Cypress is a vastly used and effective library for testing end to end workflows.
-
-Whilst components might pass individual unit tests there might be instances where they do not work as expected when used
-in conjunction with each other.
-
-## File structure
-
-All of our end to end tests are located within the `cypress` directory found at the root of the project. Inside there is
-a `e2e` directory that includes all of the workflows. Each workflow must have be suffixed with 'cy.ts'.
-
-A workflow is a collection of tests that test not just one aspect of the application, but a set of related actions. For
-example, uploading a model, reviewing said model and requesting a deployment of a model would be three separate actions,
-but all tied in one workflow. Much like unit tests, individual workflow tests must be able to be run independently of
-each other, despite all being in the same workflow.
-
-The `fixtures` directory contains any common mocked data that might be required for testing.
-
-## Running the tests
-
-In order to check that your tests work locally, you can run the following command:
-
-```bash
-npm run cy:open
-```
-
-## Examples
-
-### Example of a workflow
-
-Throughout the source of Bailo you might see data-test properties in various components. These are used for Cypress to
-easily find elements in the DOM so that the tests can check that the page is correctly rendered, and also for actions to
-be taken (such as button clicks).
-
-#### MyComponent.tsx
-
-```typescript
-...
-Click me!
-...
-```
-
-#### my-workflow.cy.ts
-
-```typescript
-describe('My workflow', () => {
- it('test we can click the button', function () {
- cy.get('[data-test=myButton]').click()
- })
-})
-```
-
-### Example of interacting with fixtures
-
-Fixtures are used for storing test data; not only does it mean that all test data is stored in one centralised place, it
-also allows Cypress to fetch it using the `cy.fixture()` function.
-
-```typescript
-cy.fixture('my_data.json').then((data) => {
- cy.get(`[role=option]:contains(${data.property})`).click()
-})
-```
-
-### `before()` & `beforeEach()`
-
-Sometimes there is code that should be ran at the start of the workflow, or before each test. `before()` is called at
-the start of the workflow before all tests, whereas `beforeEach()` is called before each individual test.
-
-```typescript
-describe('My workflow', () => {
- before(() => {
- cy.log('This is run once')
- })
-
- beforeEach(() => {
- cy.log('This will be run twice')
- })
-
- it('test 1', function () {
- // Test stuff here
- })
-
- it('test 2', function () {
- // Test stuff here
- })
-})
-```
-
-### Sharing Context
-
-An important part of tests is being able to share values between them. Below is an example of setting a value inside our
-beforeEach call and then accessing it inside a test.
-
-```typescript
-beforeEach(() => {
- cy.get('button').invoke('text').as('text')
-})
-
-it('has access to text', function () {
- this.text // is now available
-})
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/testing/manual-testing.mdx b/frontend/pages/docs/v1/developers/testing/manual-testing.mdx
deleted file mode 100644
index 2f3c3538b0..0000000000
--- a/frontend/pages/docs/v1/developers/testing/manual-testing.mdx
+++ /dev/null
@@ -1,28 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Manual Testing
-
-Automated testing does not always pick up newly introduced bugs. As a developer, it is your responsibility to make sure
-that any work has been both thoroughly automated and manually tested so that we can reduce the number of issues in the
-main branch of the source code. Likewise, if you are reviewing a pull request and there are substantial changes to core
-functionality, it is vital that you manually test the code locally as well and not just rely on automated testing.
-
-## Process
-
-When you have either developed or reviewed code that has made significant changes to core functionality, you will need
-to test that the following actions all still function correctly:
-
-- Upload a model
- - As code and binary
- - As just a model card
- - As a Docker container
-- Can favourite the model and view it in the marketplace
-- Edit the version
-- Upload a new version
-- Review the version
-- Can request a deployment
-- Review that deployment
-- If the version is not just a model card, pull down the container and check all files are there, or if you have used an
- actual model, make sure it runs correctly
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/testing/unit-testing.mdx b/frontend/pages/docs/v1/developers/testing/unit-testing.mdx
deleted file mode 100644
index 7c26ae4dac..0000000000
--- a/frontend/pages/docs/v1/developers/testing/unit-testing.mdx
+++ /dev/null
@@ -1,56 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Unit Testing
-
-Bailo makes use of the [Jest](https://jestjs.io/) library for unit testing. It is popular, robust and widely documented.
-
-## File structure
-
-Instead of using a dedicated testing directory, all unit tests should go in the same directory as the component that is
-being tested. File names should also correspond to their associated component, with the word 'spec' added before the
-file extension. For example, if you have a component called 'HelloWorld.tsx', its unit test would be
-'HelloWorld.spec.tsx'.
-
-## Running the tests
-
-In order to check that your tests work locally, you can run the following command:
-
-```bash
-npm run test
-```
-
-Or if you would like to test a specific component:
-
-```bash
-npm run test /path/to/MyComponent.spec.tsx
-```
-
-## Examples
-
-Below is a very simple example of a unit test for a React component.
-
-```typescript
-import { render, screen, waitFor } from '@testing-library/react'
-import EmptyBlob from './EmptyBlob.js'
-
-describe('EmptyBlob', () => {
- it('renders an EmptyBlob component with the text of string', async () => {
- render( )
- await waitFor(async () => {
- expect(await screen.findByText('string')).not.toBeUndefined()
- })
- })
-})
-```
-
-In the above example we describe which component is being tested and then state the nature of an individual test, in
-this case, checking whether it has rendered or not. It is important that the comment at the top of the test is kept in
-as this is used for Jest to run tests in the Node test environment.
-
-The aptly named `render()` function is called to render the component that needs to be tested (in this case,
-EmptyBlob.tsx), from there we can make use of `screen` to find aspects of the rendered component and test for their
-existence and / or displayed properties. When rendering components it is vital that any providers or wrappers that the
-component relies on will need to surround the component being tested, just as if it were to be rendered in the
-application itself.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/developers/useful-commands.mdx b/frontend/pages/docs/v1/developers/useful-commands.mdx
deleted file mode 100644
index 62093baa9c..0000000000
--- a/frontend/pages/docs/v1/developers/useful-commands.mdx
+++ /dev/null
@@ -1,105 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Useful Commands
-
-## For your .bashrc file
-
-```bash
-# Aliases for Docker Compose (dc = docker compose)
-alias dc="DOCKER_BUILDKIT=1 docker compose"
-alias dcp="DOCKER_BUILDKIT=1 docker compose -f compose.yaml -f compose.prod.yaml --env-file prod.env"
-
-
-# Running scripts (rs = run script)
-alias rs="npm run script --"
-```
-
-**Note** check your version of **`docker compose`**. If **`docker compose`** doesn't work for you then you may have
-**`docker-compose`** installed instead, simply replace **`docker compose`** with **`docker-compose`**.
-
-Once you've made these changes to your **`.bashrc`** file you'll need to run **`source ~/.bashrc`** to load in these
-changes to the terminal
-
-### Starting Bailo
-
-Build images:
-
-_You should only need to do this when dependencies have updated, e.g. changing branch / altering `package.json` /
-running `npm install`._
-
-```bash
-dc build --parallel
-```
-
-Start up Bailo:
-
-```bash
-dc up -d
-```
-
-### Style Issues on GitHub Actions
-
-```bash
-npm run style
-```
-
-### Out of Space
-
-_--volumes will also remove the contents of any volumes, e.g. Mongo / Minio. Removing it will remove all just remove
-containers_
-
-```bash
-docker system prune -af --volumes
-```
-
-### Check Backend Logs
-
-```bash
-dc logs backend
-```
-
-Or to **F**ollow the logs
-
-```bash
-dc logs -f backend
-```
-
-### Registry Won't Start
-
-You probably don't have certificates, the registry is the fastest to break with no certificates. Verify with:
-
-```bash
-dc logs registry
-```
-
-You should see a panic that includes some terms like 'ssl', 'certificates', or similar.
-
-```bash
-npm run certs
-```
-
-### PANIC
-
-When all is lost and you just want to start over again... This command takes ~3 minutes to run, but resets everything
-about your Bailo environment.
-
-> _Run this from the root Bailo directory (e.g. `/home/ec2-user/git/Bailo`)_
-
-**This will remove ALL data from Bailo.**
-
-**Note** **`dc`** stands for docker compose. Please make sure you've completed the steps at the beginning of this file
-before running these commands.
-
-```bash
-dc down --remove-orphans
-rm -rf frontend/.next
-rm -rf frontend/node_modules
-rm -rf backend/node_modules
-rm -rf node_modules
-docker system prune -af --volumes
-npm install
-dc build --parallel
-dc up -d
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/directory.tsx b/frontend/pages/docs/v1/directory.tsx
deleted file mode 100644
index af1a51d63d..0000000000
--- a/frontend/pages/docs/v1/directory.tsx
+++ /dev/null
@@ -1,138 +0,0 @@
-import Router from 'next/router'
-import { useEffect } from 'react'
-
-export default function RedirectDirectoryVisitor() {
- useEffect(() => {
- Router.push('/docs')
- }, [])
-}
-
-export interface DirectoryEntry {
- title: string
- slug: string
- header?: boolean
-}
-
-export const flatDirectory: Array = [
- // Main Docs
- { title: 'Docs', slug: '', header: true },
-
- // Users
- { title: 'Users', slug: 'users', header: true },
-
- { title: 'Upload a Model', slug: 'users/upload-a-model', header: true },
- { title: 'Why Upload A Model', slug: 'users/upload-a-model/why-upload-a-model' },
- { title: 'Requirements', slug: 'users/upload-a-model/requirements' },
- { title: 'Model Wrapper', slug: 'users/upload-a-model/model-wrapper' },
- { title: 'Preparing The Code', slug: 'users/upload-a-model/preparing-the-code' },
- { title: 'Upload To Bailo', slug: 'users/upload-a-model/upload-to-bailo' },
- { title: 'Updating A Model', slug: 'users/upload-a-model/updating-a-model' },
-
- { title: 'Deployments', slug: 'users/deployments', header: true },
- { title: 'Requesting A Deployment', slug: 'users/deployments/requesting-a-deployment' },
- { title: 'Compliance', slug: 'users/deployments/compliance' },
- { title: 'Using A Deployment', slug: 'users/deployments/using-a-deployment', header: true },
- { title: 'Docker', slug: 'users/deployments/using-a-deployment/docker' },
-
- { title: 'Approvals', slug: 'users/approvals' },
-
- { title: 'Automation', slug: 'users/automation', header: true },
- { title: 'Key Workflows', slug: 'users/automation/key-workflows' },
- { title: 'Python Client', slug: 'users/automation/python-client' },
-
- { title: 'Marketplace', slug: 'users/marketplace' },
-
- // Administration
- { title: 'Administration', slug: 'administration', header: true },
-
- { title: 'Getting Started', slug: 'administration/getting-started', header: true },
- { title: 'Building The Bailo Image', slug: 'administration/getting-started/building-the-bailo-image' },
- { title: 'Authentication', slug: 'administration/getting-started/authentication' },
- { title: 'Helm Deployments', slug: 'administration/getting-started/helm-deployments' },
- { title: 'Isolated Network Deployment', slug: 'administration/getting-started/isolated-network-deployment' },
- { title: 'Configuration', slug: 'administration/getting-started/configuration', header: true },
- { title: 'App Configuration', slug: 'administration/getting-started/configuration/app-configuration' },
- { title: 'Making A Schema', slug: 'administration/getting-started/configuration/making-a-schema' },
-
- { title: 'Migrations', slug: 'administration/migrations', header: true },
- { title: 'Bailo v0.4', slug: 'administration/migrations/bailo-0.4' },
-
- // Developers
- { title: 'Developers', slug: 'developers', header: true },
- { title: 'Contributing', slug: 'developers/contributing' },
- { title: 'Dev Setup', slug: 'developers/dev-setup' },
-
- { title: 'Main Concepts', slug: 'developers/main-concepts', header: true },
- { title: 'Logical Flow', slug: 'developers/main-concepts/logical-flow' },
- { title: 'Building Models', slug: 'developers/main-concepts/building-models' },
-
- { title: 'Processes', slug: 'developers/processes', header: true },
- { title: 'Adding An Endpoint', slug: 'developers/processes/adding-an-endpoint' },
-
- { title: 'Testing', slug: 'developers/testing', header: true },
- { title: 'Unit Testing', slug: 'developers/testing/unit-testing' },
- { title: 'E2e Testing', slug: 'developers/testing/e2e-testing' },
- { title: 'Manual Testing', slug: 'developers/testing/manual-testing' },
-
- { title: 'Useful Commands', slug: 'developers/useful-commands' },
- { title: 'Dev Notes', slug: 'developers/dev-notes' },
-
- // Errors
- { title: 'Common Errors', slug: 'errors', header: true },
- { title: 'Duplicate Version', slug: 'errors/duplicate-version' },
-
- // Markdown
- { title: 'Markdown Examples', slug: 'markdown-examples' },
-]
-
-export interface DirectoryTree {
- slug: string
- title: string
- header?: boolean
- children?: DirectoryTree[]
-}
-
-function slugsToTree(paths: Array) {
- const tree: DirectoryTree = {
- slug: '',
- title: 'Root',
- header: true,
- children: [],
- }
-
- for (const path of paths) {
- const parts = path.slug.split('/')
-
- let leaf = tree
- let currentId = ''
-
- for (const part of parts) {
- const isLastPart = part === parts[parts.length - 1]
- const isFirstPart = part === parts[0]
-
- currentId += (isFirstPart ? '' : '/') + part
-
- let child = leaf.children?.find((node) => node.slug === currentId)
- if (!child) {
- if (!leaf.children) {
- leaf.children = []
- }
-
- leaf.children.push({
- slug: currentId,
- title: path.title,
- ...(path.header ? { header: true } : {}),
- ...(isLastPart ? {} : { children: [] }),
- })
-
- child = leaf.children[leaf.children.length - 1]
- }
-
- leaf = child
- }
- }
-
- return tree
-}
-
-export const directory = slugsToTree(flatDirectory)
diff --git a/frontend/pages/docs/v1/errors/duplicate-version.mdx b/frontend/pages/docs/v1/errors/duplicate-version.mdx
deleted file mode 100644
index 14b4973a36..0000000000
--- a/frontend/pages/docs/v1/errors/duplicate-version.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Duplicate Version
-
-## Why This Error Occurred
-
-The model that you have tried to update already has the same model version.
-
-## How to fix This
-
-When updating a model ensure that you edit the 'Model Version' field to a different version, then submit on the
-Submission tab.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/index.mdx b/frontend/pages/docs/v1/index.mdx
deleted file mode 100644
index f61209240d..0000000000
--- a/frontend/pages/docs/v1/index.mdx
+++ /dev/null
@@ -1,70 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import IntroCard from 'src/docs/IntroCard'
-import Box from '@mui/material/Box'
-import Grid from '@mui/material/Grid'
-
-## What is Bailo?
-
-The aim of the Bailo service is to provide a **consistent**, **managed** ecosystem of machine learning models that may
-be deployed in a **standardised** and **well orchestrated** way. This will help to make greater use of ML models in
-operational contexts, and do so in a well controlled and low risk manner.
-
-In particular the objectives of the service include:
-
-- Providing a centralised repository of ML models, where possible with models in standard formats
-- Enabling users to find existing ML models, encouraging re-use of best practice and avoiding duplication of work
-- Preparing models for deployment in a standard way
-- Ensuring any deployed models are fully compliant, and that compliance rules are applied consistently from a single
- service
-- Providing standardised monitoring approaches for operational ML models in order to identify issues and improvement
- opportunities.
-
-Want to find out more, pick one of the following paths:
-
-
-
-
-
- Want to upload a machine learning model to Bailo? Start here.
-
-
-
-
- Use Bailo's registry, or code stores to deploy your models to other systems.
-
-
-
-
- A guide on how to review models on Bailo for ethical and technical assurance.
-
-
-
-
- Bored of doing repetitive actions, use our API or libraries.
-
-
-
-
- We've tried to make hosting Bailo easy, but documentation is always required.
-
-
-
-
- Understand the internals of Bailo and how to contribute new features.
-
-
-
-
-
-All of this documentation is available on [our GitHub repository](https://github.com/gchq/Bailo/tree/main/pages/docs).
-Corrections and additions welcome.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/approvals/index.mdx b/frontend/pages/docs/v1/users/approvals/index.mdx
deleted file mode 100644
index a08a36cad9..0000000000
--- a/frontend/pages/docs/v1/users/approvals/index.mdx
+++ /dev/null
@@ -1,50 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import bailoModelCompliance from 'public/docs/bailo_model_compliance.png'
-import bailoReviews from 'public/docs/bailo_reviews.png'
-import bailoResetApprovals from 'public/docs/bailo_reset_approvals.png'
-
-# Model Approvals
-
-When you [upload a model](../upload-a-model/why-upload-a-model) to Bailo, it does not immediately become available to
-deploy. Instead, it must first pass a series of compliance checks.
-
-
-
-
-
-You can check the compliance state of any model by clicking on the 'Compliance' tab. Each item is coloured based on its
-current status; 'green' represents passed, 'orange' for in progress and 'red' for failed. Compliance checks are split
-into automatic (does the model build, is the model card supported) and manual (technical review, policy overview).
-
-Manual reviews are split into two categories:
-
-- Technical, reviewing the core code and model implementation
-- Policy, reviewing the ethics, biases and other model card sections.
-
-It is expected that reviews are handled outside of Bailo, using your usual corporate tools. When the review is complete,
-the model can either be approved or declined from the [reviews](/review) page:
-
-
-
-
-
-Email notifications, if configured, will be sent out when you are requested to review a model. Notifications are also
-sent out to the model owner when a model has a review either approved or declined. If a review is declined, the model
-can be updated by either editing the existing version or uploading a new version. Uploading a new version automatically
-retriggers reviews. Reviews can be re-requested at any point using the 'Reset Approvals' model action:
-
-
-
-
-
-# Deployment Approvals
-
-Deployment approvals follow the same pattern as model approvals. The differences are as follows:
-
-- A deployment requires only one approval by the model owner, instead of two approvals from reviewers.
-- A deployment is only built _after_ it has been approved, instead of immediately.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/automation/key-workflows.mdx b/frontend/pages/docs/v1/users/automation/key-workflows.mdx
deleted file mode 100644
index c30e3a5b18..0000000000
--- a/frontend/pages/docs/v1/users/automation/key-workflows.mdx
+++ /dev/null
@@ -1,56 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Key Workflows
-
-Here we document some key workflows for interacting with Bailo, and how to implement them in various languages. This is
-to supplement the API Documentation pages, which describe each API call. Code examples will be given in Python, but
-should be able to be converted into other languages.
-
-## General Notes
-
-- Any endpoint that may take in files will have a request encoded as a `multipart/form-data` stream.
-- Any endpoint that is a 'get' request will take in parameters as query strings.
-- Any endpoint that is a 'put' or 'post' request will take in data as 'application/json'.
-
-All scripts rely on the following setup:
-
-```python
-import requests
-import json
-
-BASE_URL = "http://localhost:8080"
-
-# The model card for your instance of Bailo may have extra fields. These are the key fields that every
-# instance of Bailo will support.
-model_card = {
- "highLevelDetails": {
- "tags": ["facebook", "fasttext", "NLP", "language", "language_identification", "multilingual"],
- "name": "FastText Language Identification",
- "modelInASentence": "Performs language identification of words",
- "modelOverview": "Performs language identification of words in utf-8, capable of recognizing up to 176 languages.",
- "modelCardVersion": "v1.0"
- },
- "contacts": {
- "uploader": [{ "kind": "user", "id": "user" }],
- "reviewer": [{ "kind": "user", "id": "user" }],
- "manager": [{ "kind": "user", "id": "user" }]
- },
- "buildOptions": {
- "uploadType": "Model card only"
- }
-}
-```
-
-We also assume there are files called 'docker.tar', 'code.zip' and 'binary.zip' in the current directory when working
-with calls that require the uploading of one of these files.
-
-### List of Guides:
-
-- [Upload a new model to Bailo (Docker, Code / Binaries, Model Card Only)](./workflows/create-a-model)
-- [Edit an existing model card](./workflows/edit-model-card)
-- [Upload a new version for an existing model](./workflows/upload-new-version)
-
-Do none of these guides match your requirements? [Request a new one here](https://github.com/gchq/Bailo/issues) or write
-your own.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/automation/python-client.mdx b/frontend/pages/docs/v1/users/automation/python-client.mdx
deleted file mode 100644
index bb019b72c5..0000000000
--- a/frontend/pages/docs/v1/users/automation/python-client.mdx
+++ /dev/null
@@ -1,181 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Python client
-
-The Python client is located under `lib/python`
-
-## Installation
-
----
-
-### Developers
-
-```bash
-python3 -m pip install -r requirements.txt
-pre-commit install
-```
-
-### Users
-
-```bash
-python3 -m pip install -e .
-```
-
-> #### Note
->
-> You may need to install some additional requirements for
-> [pycryptodome](https://pycryptodome.readthedocs.io/en/latest/src/installation.html) e.g. on Linux:
->
-> ```bash
-> sudo yum install gcc gmp python3-devel
-> ```
-
-## Environment
-
-You will need to create a [.env](https://pypi.org/project/python-dotenv/#getting-started) file at the root of the
-project as per the [example.env](./examples/resources/example.env) with the following parameters:
-
-**AWS_GATEWAY**
-
-> TRUE if you are running on AWS as there is a size limit to the data upload
-
-Add the authentication credentials if you are using Cognito for authentication.
-
-## Authentication
-
----
-
-There are three different types of authentication:
-
-### Cognito
-
----
-
-You will need to add the additional authentication credentials in your .env file. Parameters should be as follows:
-
-**COGNITO_USERPOOL**
-
-> The Cognito userpool ID
->
-> Cognito -> user pools -> user pool ID
-
-**COGNITO_CLIENT_ID and COGNITO_CLIENT_SECRET**
-
-> The app client ID and secret
->
-> Cognito -> user pools -> pool name -> app integration -> app client name -> app client ID / show client secret
-
-**COGNITO_REGION**
-
-> eu-west-2
-
-**BAILO_URL**
-
-> Bailo API URL, e.g. http://localhost:8080/api/v1
-
-**COGNITO_USERNAME and COGNITO_PASSWORD**
-
-> Your Cognito credentials
-
-### PKI
-
----
-
-This example assumes the user will enter the certificate password manually so that the password is not stored on disk.
-
-You will need a CA file and a P12 file for authentication. The filepaths should be passed to the client.
-
-**P12_FILE**
-
-> Path to p12 file
-
-**CA_FILE**
-
-> Path to CA file
-
-**BAILO_URL**
-
-> URL of BAILO instance
-
-### Null auth
-
----
-
-If authentication is not required you can use MockAuthentication()
-
-## Testing
-
-To run the tests, run the following from the top-level directory of the Bailo Client (Bailo/lib/python):
-
-```bash
-make test
-```
-
-To run the end-to-end tests:
-
-```bash
-make e2e-test
-```
-
-## Example usage
-
-It is recommended that you use the BAILO interface for interacting with the BAILO client.
-
-### Using PKI
-
-```python
-from bailoclient import Bailo
-
-bailo = Bailo(pki_p12='path/to/p12',
- pki_ca='path/to/ca',
- bailo_url='http://localhost:8080/api/v1'
- )
-client = bailo.client
-
-client.get_my_models()
-```
-
-You will be prompted for your certificate password before you can connect.
-
-### Using Cognito
-
-```python
-from bailoclient import Bailo
-
-bailo = Bailo(cognito_user_pool_id="eu-west-2_xx1xxx1xx",
- cognito_client_id="1xx1x1x111xxxxxx1xxxxxx1xx",
- cognito_client_secret="1xx1x1xxxxxx111x1xx111xxxxxxxx111xxx1xxx1xx111xx11x",
- cognito_region="eu-west-2",
- bailo_url="http://localhost:8080/api/v1",
- cognito_username="username",
- cognito_pwd="password"
- )
-client = bailo.client
-
-client.get_my_models()
-
-```
-
-### Using a .env file
-
-With a .env file configured you can create your bailo instance with no config.
-
-```python
-from bailoclient import Bailo
-
-bailo = Bailo()
-client = bailo.client
-
-client.get_my_models()
-
-```
-
-There are example files for interacting directly with the BAILO library at:
-
-- [bailo-demo.ipynb](./examples/bailo-demo.ipynb) (no authentication)
-
-- [cognito_auth](./examples/cognito_client.py)
-
-- [pki_auth](./examples/pki_client.py)
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/automation/workflows/create-a-model.mdx b/frontend/pages/docs/v1/users/automation/workflows/create-a-model.mdx
deleted file mode 100644
index 2d9124b15f..0000000000
--- a/frontend/pages/docs/v1/users/automation/workflows/create-a-model.mdx
+++ /dev/null
@@ -1,75 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-## Create a New Model
-
-Create a new model using the `POST /model` endpoint. The 'mode' should be set to 'newModel' to specify that this should
-create a new model in Bailo.
-
-### With Docker Tar
-
-```python
-# Make sure to update the schema to the desired version.
-model_card["schemaRef"] = "/Minimal/General/v10"
-
-# Change the request type to upload a docker tar
-model_card["buildOptions"]["uploadType"] = "Prebuilt Docker image"
-
-# Usage of 'files' to set the request to a multipart form upload.
-response = requests.post(
- f"{BASE_URL}/api/v1/model",
- params={"mode": "newModel"},
- files={
- "docker": open("docker.tar", "rb"),
- "metadata": (None, json.dumps(model_card), 'application/json'),
- },
-)
-
-print(response.json())
-```
-
-### With Code / Binary
-
-```python
-# Make sure to update the schema to the desired version.
-model_card["schemaRef"] = "/Minimal/General/v10"
-
-# Change the request type to upload code and binaries.
-model_card["buildOptions"]["uploadType"] = "Code and binaries"
-model_card["buildOptions"]["seldonVersion"] = "seldonio/seldon-core-s2i-python37:1.10.0"
-
-# Usage of 'files' to set the request to a multipart form upload.
-response = requests.post(
- f"{BASE_URL}/api/v1/model",
- params={"mode": "newModel"},
- files={
- "code": open("code.zip", "rb"),
- "binary": open("binary.zip", "rb"),
- "metadata": (None, json.dumps(model_card), 'application/json'),
- },
-)
-
-print(response.json())
-```
-
-### Model Card Only
-
-```python
-# Make sure to update the schema to the desired version.
-model_card["schemaRef"] = "/Minimal/General/v10"
-
-# Make sure the metadata is set to upload just a model card.
-model_card["buildOptions"]["uploadType"] = "Model card only"
-
-# Usage of 'files' to set the request to a multipart form upload.
-response = requests.post(
- f"{BASE_URL}/api/v1/model",
- params={"mode": "newModel"},
- files={
- "metadata": (None, json.dumps(model_card), 'application/json'),
- },
-)
-
-print(response.json())
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/automation/workflows/edit-model-card.mdx b/frontend/pages/docs/v1/users/automation/workflows/edit-model-card.mdx
deleted file mode 100644
index 649395d224..0000000000
--- a/frontend/pages/docs/v1/users/automation/workflows/edit-model-card.mdx
+++ /dev/null
@@ -1,63 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-## Edit Model Card
-
-This updates an existing model card. This endpoint cannot be used to update artefacts attached to the model card (code,
-docker files, etc). It will reset any existing approvals on the model card.
-
-### Update Latest Version
-
-```python
-# If you have an existing model, the easiest way to grab this is from the URL
-# when you visit the model. It's also available under the '.uuid' field on
-# any model object and returned when uploading a new model.
-model_uuid = "fasttext-language-identification-p8xwvz"
-
-# Fetch information about the model
-model = requests.get(f"{BASE_URL}/api/v1/model/uuid/{model_uuid}").json()
-
-# This request gets more information than we need, filter down to just the latest versions metadata.
-version = model["latestVersion"]
-model_card = version["metadata"]
-
-# Update the metadata as required
-model_card["highLevelDetails"]["modelInASentence"] = "New Description"
-
-response = requests.put(
- f"{BASE_URL}/api/v1/version/{version['_id']}",
- json=model_card,
-)
-
-print(response.json())
-```
-
-### Update Specific Version
-
-```python
-# If you have an existing model, the easiest way to grab this is from the URL
-# when you visit the model. It's also available under the '.uuid' field on
-# any model object and returned when uploading a new model.
-model_uuid = "fasttext-language-identification-p8xwvz"
-
-# This should be version "name" for a model card. Do not use the internal
-# identifier, which will be a MongoID (e.g. 647cbd2b29ba31090e9423c3)
-version = "v1.0"
-
-# Fetch information about the version
-version = requests.get(f"{BASE_URL}/api/v1/model/{model_uuid}/version/{version}").json()
-
-# This request gets more information than we need, filter down to just the latest versions metadata.
-model_card = version["metadata"]
-
-# Update the metadata as required
-model_card["highLevelDetails"]["modelInASentence"] = "New aa 2a"
-
-response = requests.put(
- f"{BASE_URL}/api/v1/version/{version['_id']}",
- json=model_card,
-)
-
-print(response.json())
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/automation/workflows/upload-new-version.mdx b/frontend/pages/docs/v1/users/automation/workflows/upload-new-version.mdx
deleted file mode 100644
index 1baa0bb63e..0000000000
--- a/frontend/pages/docs/v1/users/automation/workflows/upload-new-version.mdx
+++ /dev/null
@@ -1,122 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-## Upload New Version
-
-Upload a new version to an existing model card. This allows you to upload a new machine learning image version. Most
-settings can change between model uploads (e.g. upload type and binaries). Currently, the schema must be identical to
-the initial upload schema, but this is not intended to be a limitation in the final product.
-
-### Using Latest Version as Base
-
-The below examples all assume you have your `model_card` already within your Python script. Most automated tools are
-likely to only wish to upload specific fields (e.g. a CI platform may want to update the test scores for a model). In
-any of the below instances, the following script can be used to fetch the latest model card for a given model.
-
-```python
-def latest_model_card(model_uuid: str):
- # Fetch information about the model
- model = requests.get(f"{BASE_URL}/api/v1/model/uuid/{model_uuid}").json()
- return model["latestVersion"]["metadata"]
-```
-
-### With Docker Tar
-
-```python
-# If you have an existing model, the easiest way to grab this is from the URL
-# when you visit the model. It's also available under the '.uuid' field on
-# any model object and returned when uploading a new model.
-model_uuid = "fasttext-language-identification-p8xwvz"
-
-# A new version for this model. If this version already exists the request
-# will fail.
-new_version = "v1.2"
-
-# Change the request type to upload code and binaries.
-model_card["buildOptions"]["uploadType"] = "Prebuilt Docker image"
-
-# Make sure to update the schema to the desired version.
-model_card["schemaRef"] = "/Minimal/General/v10"
-
-model_card["highLevelDetails"]["modelCardVersion"] = new_version
-
-# Usage of 'files' to set the request to a multipart form upload.
-response = requests.post(
- f"{BASE_URL}/api/v1/model",
- params={"mode": "newVersion", "modelUuid": model_uuid},
- files={
- "docker": open("docker.tar", "rb"),
- "metadata": (None, json.dumps(model_card), 'application/json'),
- },
-)
-
-print(response.json())
-```
-
-### With Code / Binary
-
-```python
-# If you have an existing model, the easiest way to grab this is from the URL
-# when you visit the model. It's also available under the '.uuid' field on
-# any model object and returned when uploading a new model.
-model_uuid = "fasttext-language-identification-p8xwvz"
-
-# A new version for this model. If this version already exists the request
-# will fail.
-new_version = "v1.2"
-
-# Change the request type to upload code and binaries.
-model_card["buildOptions"]["uploadType"] = "Code and binaries"
-model_card["buildOptions"]["seldonVersion"] = "seldonio/seldon-core-s2i-python37:1.10.0"
-
-# Make sure to update the schema to the desired version.
-model_card["schemaRef"] = "/Minimal/General/v10"
-
-model_card["highLevelDetails"]["modelCardVersion"] = new_version
-
-# Usage of 'files' to set the request to a multipart form upload.
-response = requests.post(
- f"{BASE_URL}/api/v1/model",
- params={"mode": "newVersion", "modelUuid": model_uuid},
- files={
- "code": open("code.zip", "rb"),
- "binary": open("binary.zip", "rb"),
- "metadata": (None, json.dumps(model_card), 'application/json'),
- },
-)
-
-print(response.json())
-```
-
-### Model Card Only
-
-```python
-# If you have an existing model, the easiest way to grab this is from the URL
-# when you visit the model. It's also available under the '.uuid' field on
-# any model object and returned when uploading a new model.
-model_uuid = "fasttext-language-identification-p8xwvz"
-
-# A new version for this model. If this version already exists the request
-# will fail.
-new_version = "v1.2"
-
-# Change the request type to upload code and binaries.
-model_card["buildOptions"]["uploadType"] = "Model card only"
-
-# Make sure to update the schema to the desired version.
-model_card["schemaRef"] = "/Minimal/General/v10"
-
-model_card["highLevelDetails"]["modelCardVersion"] = new_version
-
-# Usage of 'files' to set the request to a multipart form upload.
-response = requests.post(
- f"{BASE_URL}/api/v1/model",
- params={"mode": "newVersion", "modelUuid": model_uuid},
- files={
- "metadata": (None, json.dumps(model_card), 'application/json')
- },
-)
-
-print(response.json())
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/deployments/compliance.mdx b/frontend/pages/docs/v1/users/deployments/compliance.mdx
deleted file mode 100644
index 8a2fe068d4..0000000000
--- a/frontend/pages/docs/v1/users/deployments/compliance.mdx
+++ /dev/null
@@ -1,36 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import bailoDeploymentCompliance from 'public/docs/bailo_deployment_compliance.png'
-
-# Deployment Compliance
-
-A deployment is unavailable until it has passed all compliance checks. These are outlined under the 'compliance' tab.
-
-
-
-
-
-The colour of each step represents its current state:
-
-- White: Step cannot be completed at this time
-- Yellow: Step in progress
-- Red: Step failed
-- Green: Step succeeded
-
-### Troubleshooting
-
-#### Build Failed
-
-If Bailo fails to deploy an image, this step will fail. Bailo automatically retries deployments three times. The logs
-from Bailo deploying can be found under the 'build logs' tag. Deployments should not fail to build, any failure here
-will need to be fixed by a system administrator.
-
-#### Checks Failed
-
-If an approver rejects your model, the 'check' field will be red. You will need to contact the approver and discuss how
-to resolve the issue. An approver can go to the 'archived' section of the approvals at any time to update the state of
-the approval.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/deployments/requesting-a-deployment.mdx b/frontend/pages/docs/v1/users/deployments/requesting-a-deployment.mdx
deleted file mode 100644
index 2fadbfdcda..0000000000
--- a/frontend/pages/docs/v1/users/deployments/requesting-a-deployment.mdx
+++ /dev/null
@@ -1,31 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import bailoRequestDeployment from 'public/docs/bailo_request_deployment.png'
-import bailoMyDeployments from 'public/docs/bailo_my_deployments.png'
-
-# Requesting a Deployment
-
-A deployment is required to use a model that has been uploaded to Bailo. To request a deployment, first go to the model
-page and select 'Request deployment' from the actions menu.
-
-
-
-
-
-Fill out the deployment form. This can either be done by:
-
-- Filling out the automatically generated UI
-- Pasting the model deployment card directly into the 'Upload Existing' tab.
-
-After submission, the model owner will need to approve your request before you are able to use the deployed model. To
-approve a model, follow [the approvals process](../approvals/model-approvals).
-
-After your model deployment has been approved, it will automatically be made available in the 'my deployments' tab.
-
-
-
-
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/deployments/using-a-deployment/docker.mdx b/frontend/pages/docs/v1/users/deployments/using-a-deployment/docker.mdx
deleted file mode 100644
index b10df49f83..0000000000
--- a/frontend/pages/docs/v1/users/deployments/using-a-deployment/docker.mdx
+++ /dev/null
@@ -1,60 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import bailoDockerDownloadCommands from 'public/docs/bailo_docker_download_commands.png'
-
-# Docker Deployments
-
-> _Please ensure that a deployment has gone through the [requesting](../requesting-a-deployment) and
-> [compliance](../compliance) steps prior to using it._
-
-Models that have been uploaded as either a Docker image or as a model binary are available from Bailo's internal Docker
-store. This is compatible with a variety of Docker clients, including 'Kubernetes', 'Docker' and 'Podman'.
-
-## Running a Deployed Docker image
-
-Instructions and commands required to download and run a Docker image can be found by clicking "Show download commands"
-from the deployment page.
-
-
-
-
-
-Within Kubernetes and OpenShift, you must first create a secret containing your docker authentication before you can
-pull images from Bailo. To do so, follow the
-[kubernetes private registry instructions](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/).
-
-## Using a Deployed Docker image
-
-When an image is run, it starts up a load balancer and multiple instances of your model that each expose a web API. This
-API can either be consumed via gRPC or HTTP. More extensive documentation can be found
-[on the Seldon Core page](https://docs.seldon.io/projects/seldon-core/en/latest/reference/apis/v2-protocol.html). The
-gRPC proto files can be found
-[here](https://docs.seldon.io/projects/seldon-core/en/latest/reference/apis/prediction.html#proto-buffer-and-grpc-definition).
-You can also access an OpenAPI definition for a model by going to `/seldon.json`.
-
-The primary endpoint that can be used to make predictions on a model is the `/predict` endpoint. Send a `post` request
-with your data included to infer a result. Examples include:
-
-```sh
-# curl
-curl /predict -d 'json={"jsonData":{"data":["some string data"]}}'
-```
-
-```python
-# python
-import requests
-import json
-
-headers = {
- 'Content-Type': 'application/x-www-form-urlencoded',
-}
-
-content = { "jsonData": { "data": ["some string data"] } }
-data = f'json={json.dumps(content)}'
-
-response = requests.post('/predict', headers=headers, data=data)
-```
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/marketplace/index.mdx b/frontend/pages/docs/v1/users/marketplace/index.mdx
deleted file mode 100644
index 41c96a45df..0000000000
--- a/frontend/pages/docs/v1/users/marketplace/index.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-import bailoMarketplaceIcon from 'public/docs/bailo_marketplace_icon.png'
-
-## Marketplace
-
-The Marketplace is the default landing page when you access Bailo. You can return to it from any other location in Bailo
-by clicking the Marketplace icon:
-
-
-
-
-
-Models in Bailo are viewable in the Marketplace, with a search bar in the top-right to filter the list.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/upload-a-model/model-wrapper.mdx b/frontend/pages/docs/v1/users/upload-a-model/model-wrapper.mdx
deleted file mode 100644
index 9f910eb6db..0000000000
--- a/frontend/pages/docs/v1/users/upload-a-model/model-wrapper.mdx
+++ /dev/null
@@ -1,480 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Making a Model Wrapper
-
-> We use SeldonCore to wrap images. This documentation was adapted from
-> [their documentation](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/python/python_component.html). They also
-> provide [developer notes](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/python/developer_notes.html) as well
-> as a complete [API reference](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/python/api/modules.html) that we
-> recommend you browse.
-
-In order to build a custom Python model with Bailo, you first need to wrap the model in it's own Python Class.
-
-## Model
-
-To wrap your machine learning model create a Class that has a predict method with the following signature:
-
-```python
- def predict(self, X: Union[np.ndarray, List, str, bytes, Dict], names: Optional[List[str]], meta: Optional[Dict] = None) -> Union[np.ndarray, List, str, bytes, Dict]:
-```
-
-Your predict method will receive a numpy array `X` with iterable set of column names (if they exist in the input
-features) and optional Dictionary of meta data. It should return the result of the prediction as either:
-
-- Numpy array
-- List of values
-- String or Bytes
-- Dictionary
-
-A simple example is shown below:
-
-```python
-class MyModel(object):
- """
- Model template. You can load your model parameters in __init__ from a location accessible at runtime
- """
-
- def __init__(self):
- """
- Add any initialization parameters. These will be passed at runtime from the graph definition parameters defined in your seldondeployment kubernetes resource manifest.
- """
- print("Initializing")
-
- def predict(self, X, features_names=None):
- """
- Return a prediction.
-
- Parameters
- ----------
- X : array-like
- feature_names : array of feature names (optional)
- """
- print("Predict called - will run identity function")
- return X
-```
-
-### Returning class names
-
-You can also provide a method to return the column names for your prediction with a method `class_names` with signature
-show below:
-
-```python
- def class_names(self) -> Iterable[str]:
-```
-
-### Examples
-
-You can follow
-[various notebook examples](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/examples/notebooks.html).
-
-## Transformers
-
-Seldon Core allows you to create components to transform features either in the input request direction (input
-transformer) or the output response direction (output transformer). For these components create methods with the
-signatures below:
-
-```python
- def transform_input(self, X: Union[np.ndarray, List, str, bytes, Dict], names: Optional[List[str]], meta: Optional[Dict] = None) -> Union[np.ndarray, List, str, bytes, Dict]:
-
- def transform_output(self, X: Union[np.ndarray, List, str, bytes, Dict], names: Optional[List[str]], meta: Optional[Dict] = None) -> Union[np.ndarray, List, str, bytes, Dict]:
-```
-
-## Combiners
-
-Seldon Core allows you to create components that combine responses from multiple models into a single response. To
-create a class for this add a method with signature below:
-
-```python
- def aggregate(self, features_list: List[Union[np.ndarray, str, bytes]], feature_names_list: List) -> Union[np.ndarray, List, str, bytes, Dict]:
-```
-
-A simple example that averages a set of responses is shown below:
-
-```python
-import numpy as np
-logger = logging.getLogger(__name__)
-
-class ImageNetCombiner(object):
-
- def aggregate(self, Xs, features_names):
- return (np.reshape(Xs[0],(1,-1)) + np.reshape(Xs[1], (1,-1)))/2.0
-```
-
-## Routers
-
-Routers provide functionality to direct a request to one of a set of child components. For this you should create a
-method with signature as shown below that returns the `id` for the child component to route the request to. The `id` is
-the index of children connected to the router.
-
-```python
- def route(self, features: Union[np.ndarray, str, bytes], feature_names: Iterable[str]) -> int:
-```
-
-To see examples of this you can follow the various
-[example routers](https://github.com/SeldonIO/seldon-core/tree/master/components/routers) that are part of Seldon Core.
-
-## Adding Custom Metrics
-
-To return metrics associated with a call create a method with signature as shown below:
-
-```python
- def metrics(self) -> List[Dict]:
-```
-
-This method should return a Dictionary of metrics as described in the
-[custom metrics](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/analytics/analytics.md#custom-metrics) docs.
-
-An illustrative example is shown below:
-
-```python
-class ModelWithMetrics(object):
-
- def __init__(self):
- print("Initialising")
-
- def predict(self,X,features_names):
- print("Predict called")
- return X
-
- def metrics(self):
- return [
- {"type": "COUNTER", "key": "mycounter", "value": 1}, # a counter which will increase by the given value
- {"type": "GAUGE", "key": "mygauge", "value": 100}, # a gauge which will be set to given value
- {"type": "TIMER", "key": "mytimer", "value": 20.2}, # a timer which will add sum and count metrics - assumed millisecs
- ]
-```
-
-Prior to Seldon Core 1.1.0 not implementing custom metrics logs a message at the info level at each predict call.
-Starting with Seldon Core 1.1.0 this is logged at the debug level. To suppress this warning implement a metrics function
-returning an empty list:
-
-```python
-def metrics(self):
- return []
-```
-
-## Returning Tags
-
-If we wish to add arbitrary tags to the returned metadata you can provide a `tags` method with signature as shown below:
-
-```python
- def tags(self) -> Dict:
-```
-
-A simple example is shown below:
-
-```python
-class ModelWithTags(object):
-
- def predict(self,X,features_names):
- return X
-
- def tags(self):
- return {"system":"production"}
-```
-
-## Runtime Metrics and Tags
-
-Starting from SC 1.3 `metrics` and `tags` can also be defined on the output of `predict`, `transform_input`,
-`transform_output`, `send_feedback`, `route` and `aggregate`.
-
-This is thread-safe.
-
-```python
-from seldon_core.user_model import SeldonResponse
-
-
-class Model:
- def predict(self, X, names=[], meta={}):
- runtime_metrics = {"type": "COUNTER", "key": "instance_counter", "value": len(X)},
- runtime_tags = {"runtime": "tag", "shared": "right one"}
- return SeldonResponse(data=X, metrics=runtime_metrics, tags=runtime_tags)
-
- def metrics(self):
- return [{"type": "COUNTER", "key": "requests_counter", "value": 1}]
-
- def tags(self):
- return {"static": "tag", "shared": "not right one"}
-```
-
-Note that `tags` and `metrics` defined through `SeldonResponse` take priority. In above examples returned tags will be:
-
-```json
-{ "runtime": "tag", "shared": "right one", "static": "tag" }
-```
-
-## REST Health Endpoint
-
-If you wish to add a REST health point, you can implement the `health_status` method with signature as shown below:
-
-```python
- def health_status(self) -> Union[np.ndarray, List, str, bytes]:
-```
-
-You can use this to verify that your service can respond to HTTP calls after you have built your docker image and also
-as kubernetes liveness and readiness probes to verify that your model is healthy.
-
-A simple example is shown below:
-
-```python
-class ModelWithHealthEndpoint(object):
- def predict(self, X, features_names):
- return X
-
- def health_status(self):
- response = self.predict([1, 2], ["f1", "f2"])
- assert len(response) == 2, "health check returning bad predictions" # or some other simple validation
- return response
-```
-
-When you use `seldon-core-microservice` to start the HTTP server, you can verify that the model is up and running by
-checking the `/health/status` endpoint:
-
-```console
-$ curl localhost:5000/health/status
-{"data":{"names":[],"tensor":{"shape":[2],"values":[1,2]}},"meta":{}}
-```
-
-Additionally, you can also use the `/health/ping` endpoint if you want a lightweight call that just checks that the HTTP
-server is up:
-
-```console
-$ curl localhost:5000/health/ping
-pong%
-```
-
-## Low level Methods
-
-If you want more control you can provide a low-level methods that will provide as input the raw proto buffer payloads.
-The signatures for these are shown below for release `seldon_core>=0.2.6.1`:
-
-```python
- def predict_raw(self, msg: Union[Dict, prediction_pb2.SeldonMessage]) -> prediction_pb2.SeldonMessage:
-
- def send_feedback_raw(self, feedback: prediction_pb2.Feedback) -> prediction_pb2.SeldonMessage:
-
- def transform_input_raw(self, msg: Union[Dict, prediction_pb2.SeldonMessage]) -> prediction_pb2.SeldonMessage:
-
- def transform_output_raw(self, msg: Union[Dict, prediction_pb2.SeldonMessage]) -> prediction_pb2.SeldonMessage:
-
- def route_raw(self, msg: prediction_pb2.SeldonMessage) -> prediction_pb2.SeldonMessage:
-
- def aggregate_raw(self, msgs: prediction_pb2.SeldonMessageList) -> prediction_pb2.SeldonMessage:
-
- def health_status_raw(self) -> prediction_pb2.SeldonMessage:
-```
-
-## User Defined Exceptions
-
-If you want to handle custom exceptions define a field `model_error_handler` as shown below:
-
-```python
- model_error_handler = flask.Blueprint('error_handlers', __name__)
-```
-
-An example is as follows:
-
-```python
-"""
-Model Template
-"""
-class MyModel(Object):
-
- """
- The field is used to register custom exceptions
- """
- model_error_handler = flask.Blueprint('error_handlers', __name__)
-
- """
- Register the handler for an exception
- """
- @model_error_handler.app_errorhandler(UserCustomException)
- def handleCustomError(error):
- response = jsonify(error.to_dict())
- response.status_code = error.status_code
- return response
-
- def __init__(self, metrics_ok=True, ret_nparray=False, ret_meta=False):
- pass
-
- def predict(self, X, features_names, **kwargs):
- raise UserCustomException('Test-Error-Msg',1402,402)
- return X
-```
-
-```python
-"""
-User Defined Exception
-"""
-class UserCustomException(Exception):
-
- status_code = 404
-
- def __init__(self, message, application_error_code,http_status_code):
- Exception.__init__(self)
- self.message = message
- if http_status_code is not None:
- self.status_code = http_status_code
- self.application_error_code = application_error_code
-
- def to_dict(self):
- rv = {"status": {"status": self.status_code, "message": self.message,
- "app_code": self.application_error_code}}
- return rv
-
-```
-
-## Multi-value numpy arrays
-
-By default, when using the data ndarray parameter, the conversion to ndarray (by default) converts all inner types into
-the same type. With models that may take as input arrays with different value types, you will be able to do so by
-overriding the `predict_raw` function yourself which gives you access to the raw request, and creating the numpy array
-as follows:
-
-```python
-import numpy as np
-
-class Model:
- def predict_raw(self, request):
- data = request.get("data", {}).get("ndarray")
- if data:
- mult_types_array = np.array(data, dtype=object)
-
- # Handle other data types as required + your logic
-```
-
-## Gunicorn and load
-
-If the wrapped python class is served under [Gunicorn](https://gunicorn.org/) then as part of initialization of each
-gunicorn worker a `load` method will be called on your class if it has it. You should use this method to load and
-initialise your model. This is important for Tensorflow models which need their session created in each worker process.
-The [Tensorflow MNIST example](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/examples/deep_mnist.html) does
-this.
-
-```python
-import tensorflow as tf
-import numpy as np
-import os
-
-class DeepMnist(object):
- def __init__(self):
- self.loaded = False
- self.class_names = ["class:{}".format(str(i)) for i in range(10)]
-
- def load(self):
- print("Loading model",os.getpid())
- self.sess = tf.Session()
- saver = tf.train.import_meta_graph("model/deep_mnist_model.meta")
- saver.restore(self.sess,tf.train.latest_checkpoint("./model/"))
- graph = tf.get_default_graph()
- self.x = graph.get_tensor_by_name("x:0")
- self.y = graph.get_tensor_by_name("y:0")
- self.loaded = True
- print("Loaded model")
-
- def predict(self,X,feature_names):
- if not self.loaded:
- self.load()
- predictions = self.sess.run(self.y,feed_dict={self.x:X})
- return predictions.astype(np.float64)
-```
-
-## Integer numbers
-
-The `json` package in Python, parses numbers with no decimal part as integers. Therefore, a tensor containing only
-numbers without a decimal part will get parsed as an integer tensor.
-
-To illustrate the above, we can consider the following example:
-
-```json
-{
- "data": {
- "ndarray": [0, 1, 2, 3]
- }
-}
-```
-
-By default, the `json` package will parse the array in the `data.ndarray` field as an array of Python `Integer` values.
-Since there are no floating-point values, `numpy` will then create a tensor with `dtype = np.int32`.
-
-If we want to force a different behaviour, we can use the underlying `predict_raw()` method to control the
-deserialisation of the input payload. As an example, using the example above, we could force the resulting tensor to
-always using `dtype = np.float64` by implementing `predict_raw()` as:
-
-```python
-import numpy as np
-
-class Model:
- def predict_raw(self, request):
- data = request.get("data", {}).get("ndarray")
- if data:
- float_array = np.array(data, dtype=np.float64)
-
- # Make predictions using float_array
-```
-
-## Incubating features
-
-### REST Metadata Endpoint
-
-The python wrapper will automatically expose a `/metadata` endpoint to return metadata about the loaded model. It is up
-to the developer to implement a `metadata` method in their class to provide a `dict` back containing the model metadata.
-
-See metadata [documentation](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/reference/apis/metadata.md) for more
-details.
-
-#### Example format:
-
-```python
-class Model:
- ...
-
- def init_metadata(self):
-
- meta = {
- "name": "model-name",
- "versions": ["model-version"],
- "platform": "platform-name",
- "inputs": [{"name": "input", "datatype": "BYTES", "shape": [1]}],
- "outputs": [{"name": "output", "datatype": "BYTES", "shape": [1]}],
- }
-
- return meta
-```
-
-#### Validation
-
-Output of developer-defined `metadata` method will be validated to follow the
-[V2 dataplane proposal](https://github.com/kserve/kserve/blob/master/docs/predict-api/v2/required_api.md#model-metadata)
-protocol, see [this](https://github.com/SeldonIO/seldon-core/issues/1638) GitHub issue for details:
-
-```typescript
-$metadata_model_response =
-{
- "name" : $string,
- "versions" : [ $string, ... ], // optional
- "platform" : $string,
- "inputs" : [ $metadata_tensor, ... ],
- "outputs" : [ $metadata_tensor, ... ]
-}
-```
-
-with
-
-```typescript
-$metadata_tensor =
-{
- "name" : $string,
- "datatype" : $string,
- "shape" : [ $number, ... ]
-}
-```
-
-If validation fails server will reply with `500` response `MICROSERVICE_BAD_METADATA` when requested for `metadata`.
-
-#### Examples:
-
-- [Basic Examples for Model with Metadata](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/examples/metadata.html)
-- [SKLearn Server example with MinIO](https://docs.seldon.io/projects/seldon-core/en/v1.10.0/examples/minio-sklearn.html)
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/upload-a-model/preparing-the-code.mdx b/frontend/pages/docs/v1/users/upload-a-model/preparing-the-code.mdx
deleted file mode 100644
index eb00b2177f..0000000000
--- a/frontend/pages/docs/v1/users/upload-a-model/preparing-the-code.mdx
+++ /dev/null
@@ -1,196 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Preparing the Code
-
-In addition to the model card, Bailo expects every upload to come with a `code` and `binary` file. These files contain
-the supporting code and binary data respectively.
-
-## Binary
-
-The `binary` file contains your models vectors or data. This is a model specific format and has no requirements beyond
-being uploaded as a compressed `.zip` file. This is the model that is generated through training, which may be generated
-internally or imported as an open source or commercially acquired pre-trained model.
-
-There are no restrictions on the framework used to generate the model, but details of the training approach and training
-data should be provided within the associated model card.
-
-The model binary is loaded into a model class provided by the supporting model code and is included in the image
-generated by Bailo. When this image is deployed within a target environment it exposes a set of endpoints, one of which
-is the predict endpoint that's used to retrieve the model's results.
-
-The binary `.zip` folder is extracted to the root working directory, the same location that the code file is extracted
-to.
-
-## Code
-
-As a model contributor you must develop your model code in Python and structure it in accordance with the guidelines
-laid out on this page. This includes making use of a template model class, which has the benefit of providing
-consistency with respect to the code structure, but avoids imposing unnecessary restrictions. At present, this class
-must be present in your codebase but the intention is to make it available for import as an external library.
-
-The `code` file should be a compressed `.zip` file with the following file structure:
-
-```txt
-code.zip/
-├─ Model.py
-├─ requirements.txt
-└─ basemodel/
- ├─ basemodel.py
- └─ __init__.py
-```
-
-- `model.py`: discussed under the [Model Wrapper](./model-wrapper) section.
-- `requirements.txt`: is a standard dependency file, explained in detail by
- [PyPa](https://pip.pypa.io/en/stable/reference/requirements-file-format/).
-- `basemodel.py` & `__init__.py`: is an abstract class to help you implement the requirement functions.
-
-We provide a basemodel class that contains the functions:
-
-- predict
-- metrics
-- metadata
-
-As a model contributor, you need to import this and use it as a super class to your model code and, at minimum,
-instantiate the predict method in order to create a valid model. This approach allows you to test your model code
-externally, while ensuring minimal integration work is required when submitting the model to Bailo.
-
-The basemodel can be found [here](../examples/example_model_code/basemodel/basemodel.py), but the contents are also
-provided below for easy reference.
-
-**\_\_init\_\_.py**
-
-```python
-from .basemodel import BaseModel
-```
-
-**basemodel.py**
-
-```python
-# basemodel.py
-from abc import ABC, abstractmethod
-
-
-class BaseModel(ABC):
- """
- The BaseModel class provides an abstract template for model contributors.
- Models must provide a predict method but do not have to provide metrics or metadata
- """
-
- def __init__(self):
- """
- The model should be loaded here in the Model sub-class generated
- from the BaseModel abstract class
-
- Example:
- self.model = load_model("model")
- """
- super().__init__()
-
- def predict(self, input, features_names):
- """
- Provides a model prediction for a given input and set of feature names
- :param input: Prediction input containing a data component
- :param feature_names: Optional set of feature names
- :return: JSON serialisable numpy array, list of values, string or bytes
-
- Example:
- data = input["data"]
- result = self.model.predict(data)
- return result
- """
- pass
-
- def metrics(self):
- """
- Optional method for adding additional metrics
- :return:
-
- Example:
- return an array of metrics tuples
- metrics = [{"type": "COUNTER", "key": "metric_1", "value": 1}]
- return metrics
- """
- pass
-
- def metadata(self):
- """
- Optional metadata method.
- :return:
-
- Example:
- meta = {"field": "value"}
- return meta
- """
- pass
-```
-
-**Example - model.py**
-
-```python
-import fasttext
-import numpy as np
-import json
-
-from basemodel import BaseModel
-
- class Model(BaseModel):
- """
- This class loads the FastText lid.176.bin language ID model.
- It instantiates the predict abstract method from the BaseModel class
- and overwrites the metrics method.
- """
-
- def __init__(self):
- """
- Constructor, which loads the lid model and calls the constructor method
- of the BaseModel super class.
- """
- self.model = fasttext.load_model("lid.176.bin")
-
- def predict(self, input, features_names=None):
- """
- Generate a prediction from the model given the specified input data and feature names.
- :param input: Dictionary containing a data key with a text value
- :param feature_names: Set of feature names to be applied (not used in this model)
- :return: Dictionary containing an array of predictions and an array of probabilities
- """
- data = input["data"]
- (self.predictions, probabilities) = self.model.predict(data)
- self.probabilities = [float(p) for p in probabilities]
-
- # Need to convert probabilities from ndarry to floats, as cant serialize numpy objects
- # We can't rely on the order of these being maintained. This needs to be corrected.
- return {"predictions": self.predictions, "probabilites": self.probabilities}
-
- def metrics(self):
- """
- Generate model metrics for prediction count and metadata.
- :return: Array of dictionary tuples
- """
- # Add metrics for prediction count and metadata
- metrics = [
- {"type": "COUNTER", "key": "predictions_total", "value": 1},
- {"type": "GAUGE", "key": "model_meta", "value": 1}
- ]
- # Track confidence metrics
- for i in range(len(self.predictions)):
- metrics.append(
- {
- "type": "GAUGE",
- "key": "prediction_confidence_{}".format(self.predictions[i][0]),
- "value": self.probabilities[i]
- }
- )
- return metrics
-```
-
-The current approach does not specify the allowable return types from the model's predict method prior to wrapping.
-However, the return type must be json serializable and this may present difficulties where the type returned is complex
-or contains non-serializable types (such as numpy floats within dictionaries or arrays within dictionaries).
-
-As a model contributor you must therefore perform any necessary conversions to ensure that the output of the predict
-method is json serialisable. This includes external models, such as those available from opensource or commercially
-acquired. In these cases you will need to perform the necessary conversion in the model class but this will not impact
-on the acquired model itself.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/upload-a-model/requirements.mdx b/frontend/pages/docs/v1/users/upload-a-model/requirements.mdx
deleted file mode 100644
index 0aa910c8f0..0000000000
--- a/frontend/pages/docs/v1/users/upload-a-model/requirements.mdx
+++ /dev/null
@@ -1,22 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Requirements
-
-You should consider uploading a model once you have trained and tested it in your own environment and you feel that it
-is **production ready**. Bailo is not intended to hold models until they have reached this point and so any development
-must be carried out in an external environment. As a model developer you must make yourself aware of and meet the
-requirements that are placed on you under the AI Policy and ensure that you have appropriate data owner approval to use
-the training data that you have identified.
-
-To submit a model you will need to provide the following three artifacts:
-
-- A model card containing details of the provenance, training, limitations and bias, along with any lifecycle deadlines
-- The trained model binary, representing the trained model itself
-- Supporting code that exposes defined endpoints on the model (notably a `predict` or `predict_raw` endpoint)
-
-The model card can either be designed using the [upload form](/upload) or as a JSON blob that follows the
-[upload schema](/api/v1/schema/default?use=UPLOAD).
-
-More information on the supporting code and binary formats are provided later in this documentation.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/upload-a-model/updating-a-model.mdx b/frontend/pages/docs/v1/users/upload-a-model/updating-a-model.mdx
deleted file mode 100644
index 2b7482c36d..0000000000
--- a/frontend/pages/docs/v1/users/upload-a-model/updating-a-model.mdx
+++ /dev/null
@@ -1,16 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Updating a Model
-
-## Editing a Model
-
-To edit a model, first make sure it has not been approved by both the manager and technical reviewer; then select edit
-on the actions tab. This will bring up a form identical to the model upload form, except without the file upload and
-schema selection. Make any changes, then submit on the Submission tab.
-
-## Uploading a New Version
-
-To upload a new version, select Upload new version on the actions tab. This will bring up a form identical to the model
-upload form, except without schema selection. Make any changes, then submit on the Submission tab.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/upload-a-model/upload-to-bailo.mdx b/frontend/pages/docs/v1/users/upload-a-model/upload-to-bailo.mdx
deleted file mode 100644
index e7843b43af..0000000000
--- a/frontend/pages/docs/v1/users/upload-a-model/upload-to-bailo.mdx
+++ /dev/null
@@ -1,42 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import bailoUpload from 'public/docs/bailo_upload.png'
-import bailoUploadSubmission from 'public/docs/bailo_upload_submission.png'
-import bailoModelPage from 'public/docs/bailo_model_page.png'
-
-# Uploading to Bailo
-
-Now that you have made a model and prepared `code.zip` and `binary.zip` files, it is time to post it to Bailo. This
-guide assumes you will use the UI to fill out the required model card and upload the files, but we also have an API as
-well as clients in several languages to make the process more automatic.
-
-First, visit the [/upload](/upload) page. Here you will see a form taking you through the steps required to upload your
-model. There is also:
-
-- A 'schema' dropdown, which lets you select different model schemas to follow.
-- An 'uploading existing' tab, which lets you upload premade JSON.
-
-
-
-
-
-Each tab has a state, either 'in progress' or 'done'. Once all tabs are done, you can head to the 'submission' tab and
-upload your model.
-
-
-
-
-
-The submission tab enables you to export your data in both a human readable (HTML) format and a machine readable (JSON)
-format. After confirming your data is correct, you should press 'Submit' to upload your model to Bailo.
-
-After submitting your model, a progress bar will appear as the files and data are uploaded to Bailo. Upon completion,
-you will be redirected to your model:
-
-
-
-
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/v1/users/upload-a-model/why-upload-a-model.mdx b/frontend/pages/docs/v1/users/upload-a-model/why-upload-a-model.mdx
deleted file mode 100644
index 522758df59..0000000000
--- a/frontend/pages/docs/v1/users/upload-a-model/why-upload-a-model.mdx
+++ /dev/null
@@ -1,51 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Why Upload A Model
-
-### Ensure Policy Compliance
-
-As a model developer your primary motivation for uploading a model to Bailo is to make it available within a governance
-framework that **ensures technical quality and legal and policy compliance**. Bailo provides this by requiring all
-uploaded models to pass both a technical review and an assessment by a senior responsible officer with respect to
-organisation objectives, legal requirements and policy guidelines. It further ensures that models and deployments remain
-compliant by enforcing review actions on deadline lifecycle dates identified in the model card when uploading the model.
-
-### Allow Model Sharing
-
-Developing, training and testing ML models is a resource intensive process. The manual effort and time required is often
-significant and there is usually a high computational cost and an increasing requirement for specialist hardware. It is
-therefore important to **encourage the re-use of existing models**, even when they range across multiple use-cases. In a
-large organisation it is particularly important to capitalise on the work of disparate teams and to avoid the
-duplication of effort that occurs when these teams develop models in isolation that address similar requirements.
-
-Bailo addresses the issue of duplicated effort by providing users with a _central searchable repository_ for ML models
-that have been approved for operational use. Each candidate model is uploaded with a model card that provides
-information about its purpose and details about its provenance, the data used for training, any known limitations and
-bias. This information is used during the approval process but is then made available within the model marketplace.
-Exposing this information allows users to assess whether a pre-existing model is suitable for re-use within their
-particular context.
-
-### Share Best Practices
-
-Re-using existing models **encourages the awareness and adoption of best-practice** and tends to improve the quality of
-models over time. However, the Bailo service imposes a quality gate in the form of an approval process by a model
-technical reviewer. Uploaded models do not become visible to users until they have passed both this technical review and
-a subsequent review by a senior responsible officer. The technical review assesses the technical aspects of the model
-whilst the policy review assesses the suitability of the model with respect to mission objectives, as well as the manner
-in which the model developer has addressed legal requirements and adhered to policy guidelines.
-
-### Notes
-
-Although the policy review includes a legal and other assessments, this approval cannot be regarded as permanent and
-needs to be repeated. The frequency of these subsequent reviews is dependent upon many factors, such as the volatility
-of the data on which the model acts or changes in the operational environment.
-
-The metadata associated with a model includes information about how often a model must be retrained and reviewed, and
-includes the reasoning behind these respective frequencies. It also provides a date by which the model should be
-considered obsolete and retired. Users who request a deployment are made aware of the importance of these lifecycle
-events at the point of request, as are model contributors.
-
-At present the management of these lifecycle events is manual but the intention is that in future these will be handled
-through a monitoring and notification mechanism.
-
-export default ({ children }) => {children}
From 6a0c68f3ecf432b729e374a09ede5b6ed2814179 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 14 May 2026 10:33:40 +0000
Subject: [PATCH 02/23] Rewrite and add docs
---
.../review-roles/managing-review-roles.mdx | 113 +++++++++
.../schemas/schema-migrations.mdx | 101 ++++++++
.../schemas/understanding-schemas.mdx | 97 ++++++++
frontend/pages/docs/directory.tsx | 66 +++--
.../docs/getting-started/core-concepts.mdx | 137 +++++++++++
.../docs/getting-started/quick-start.mdx | 125 ++++++++++
frontend/pages/docs/index.mdx | 21 +-
frontend/pages/docs/reference/glossary.mdx | 107 ++++++++
.../docs/reference/roles-and-permissions.mdx | 141 +++++++++++
.../users/data-cards/creating-a-data-card.mdx | 79 ++++++
.../users/data-cards/managing-data-cards.mdx | 73 ++++++
.../python-client.mdx | 230 +++++++++++++++++-
.../users/reviews/understanding-reviews.mdx | 93 +++++++
frontend/src/docs/DocsWrapper.tsx | 13 +-
14 files changed, 1362 insertions(+), 34 deletions(-)
create mode 100644 frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
create mode 100644 frontend/pages/docs/administration/schemas/schema-migrations.mdx
create mode 100644 frontend/pages/docs/administration/schemas/understanding-schemas.mdx
create mode 100644 frontend/pages/docs/getting-started/core-concepts.mdx
create mode 100644 frontend/pages/docs/getting-started/quick-start.mdx
create mode 100644 frontend/pages/docs/reference/glossary.mdx
create mode 100644 frontend/pages/docs/reference/roles-and-permissions.mdx
create mode 100644 frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
create mode 100644 frontend/pages/docs/users/data-cards/managing-data-cards.mdx
create mode 100644 frontend/pages/docs/users/reviews/understanding-reviews.mdx
diff --git a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
new file mode 100644
index 0000000000..e64df108a7
--- /dev/null
+++ b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
@@ -0,0 +1,113 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Managing Review Roles
+
+Review roles define who must approve releases and access requests for models in your organisation. As an administrator,
+you can create, edit, and delete review roles to match your governance requirements.
+
+Only administrators will have the following options available to them.
+
+## Viewing Existing Roles
+
+To see all review roles configured in your Bailo instance, select **Review Roles** from the navigation sidebar.
+
+This page lists all review roles with their name, short name, description, and associated system role.
+
+## Creating a Review Role
+
+To create a new review role:
+
+1. Navigate to **Review Roles** from the navigation sidebar
+2. Click **Create new review role**
+3. Fill in the following fields:
+
+| Field | Description | Example |
+| ------------------------- | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
+| **Name** | The display name for the role | Model Technical Reviewer |
+| **Short Name** | A brief identifier used internally | mtr |
+| **Description** | What this role is responsible for reviewing | Reviews the technical quality and fitness for purpose of models |
+| **System Role** | The minimum entry role a user must have to be assigned this review role. Options: Owner, Contributor, Consumer, or none | Contributor |
+| **Default collaborators** | Users or groups automatically assigned to this role when new models are created | `team-leads` |
+
+4. Click **Submit**
+
+### Choosing a System Role
+
+The **System Role** field links a review role to an entry role. This means:
+
+- If set to **Contributor**, only users who are at least contributors on a model can be assigned this review role
+- If set to **Owner**, only owners can be assigned
+- If left empty, any user can be assigned regardless of their entry role
+
+### Default collaborators
+
+Default collaborators are pre-populated when a model owner sets up review roles on their model. This is useful for roles
+that should always be assigned to the same team or person across all models.
+
+## Editing a Review Role
+
+To edit an existing role:
+
+1. Navigate to **Review Roles**
+2. Click on the role you want to edit
+3. Click **Edit Role**
+4. Modify the fields as needed
+5. Click **Submit** to save your changes
+
+Changes to review roles apply to all schemas that use the role and all models that use those schemas.
+
+## Deleting a Review Role
+
+To delete a review role:
+
+1. Navigate to **Review Roles**
+2. Click on the role you want to delete
+3. Click **Delete role**
+4. Click **Confirm** in the confirmation popup
+
+> **Warning**: Deleting a review role removes it from all schemas that reference it. Models using those schemas will no
+> longer require approval from that role. Make sure this is intended before deleting.
+
+## Connecting Roles to Schemas
+
+After creating review roles, you need to attach them to schemas. This is done when creating or editing a schema:
+
+1. Navigate to **Schemas** from the navigation sidebar
+2. Create or edit a schema
+3. In the **Review Roles** section, select which roles should be required for this schema
+4. Save the schema
+
+Every model that uses this schema will then require all attached review roles to approve releases before they are
+finalised.
+
+## Common Configurations
+
+### Two-role governance (MTR + MSRO)
+
+The most common setup uses two review roles:
+
+- **Model Technical Reviewer (MTR)**: Reviews technical quality. System role: Contributor.
+- **Model Senior Responsible Officer (MSRO)**: Reviews governance and compliance. System role: Owner.
+
+Both roles are attached to the model card schema. A release is only approved when both the MTR and MSRO approve it.
+
+### Single-role governance
+
+For simpler workflows, a single review role may be sufficient:
+
+- **Model Reviewer**: Reviews all aspects. System role: Contributor.
+
+### Fixed reviewer
+
+For strict compliance requirements:
+
+- Create a role with **Default Entities** set to your compliance team
+- This ensures the same team always reviews every model
+
+## Related Pages
+
+- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - Entry roles vs review roles
+- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - How schemas and review roles connect
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/administration/schemas/schema-migrations.mdx b/frontend/pages/docs/administration/schemas/schema-migrations.mdx
new file mode 100644
index 0000000000..4aca2e43e6
--- /dev/null
+++ b/frontend/pages/docs/administration/schemas/schema-migrations.mdx
@@ -0,0 +1,101 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Schema Migrations
+
+As your organisation's requirements evolve, you may need to update your schemas. Schema migrations allow you to
+transform existing model card data from one schema version to another, without requiring model owners to manually
+re-enter their information.
+
+Only administrators will have the following options available to them.
+
+## When to Use Schema Migrations
+
+Common scenarios:
+
+- You've updated a schema to add new required fields
+- You're reorganising the section structure of a schema
+- You're retiring an old schema and moving models to a newer version
+
+## How Migrations Work
+
+A schema migration is a **plan** that maps questions from a source schema to a target schema. For each question in the
+source, you specify one of two actions:
+
+| Action | Description |
+| ---------- | ------------------------------------------------------------------------------------------ |
+| **Move** | The answer is copied from the source location to a specified location in the target schema |
+| **Delete** | The answer is discarded and not carried over to the target schema |
+
+The migration plan preserves all existing data that you choose to move, while allowing you to restructure how it is
+organised in the new schema.
+
+## Comparing schemas
+
+Comparing schemas is a useful way to identify the differences between two schemas when planning a migration.
+
+1. Navigate to **Schemas** from the navigation sidebar
+2. Select **Compare**
+3. Fill in the comparison schemas:
+ - **Source Schema**: The schema you are migrating from
+ - **Target Schema**: The schema you are migrating to
+
+## Creating a Migration Plan
+
+1. Navigate to **Schemas** from the navigation sidebar
+2. Select **Migrations**
+3. Click **New schema migration plan**
+4. Fill in the migration schemas:
+ - **Source Schema**: The schema you are migrating from
+ - **Target Schema**: The schema you are migrating to
+5. Click **Begin migration**
+6. Fill in the migration details:
+ - **Migration name**: A descriptive name for the migration (e.g. "v1 to v2 model card migration")
+ - **Migration description**: What this migration does and why
+7. For each question in the source schema, specify:
+ - **Move**: Map it to a path in the target schema
+ - **Delete**: Mark it for removal
+8. Verify the intended actions under **View Actions**
+9. Save as **Draft** (for testing) or **Final** (ready to use)
+
+### Draft vs Final
+
+- **Draft** migrations can be edited and tested but cannot be applied to models
+- **Final** migrations are locked and can be applied to models
+
+It is recommended to save as a draft first, verify the mappings are correct, and then mark as final when ready.
+
+## Applying a Migration
+
+Once a migration plan is finalised, it can be applied to individual models:
+
+- Models with the source schema will display "There is a migration available for this model." with a **Migrate** button
+- Model owners may then **Select a Migration Plan**
+- This transforms the model's existing model card data according to the migration plan and switches the model to the
+ target schema
+
+> **Note**: Applying a migration creates a new model card version. The previous version is preserved in the model's
+> history, so you can always see what the data looked like before the migration.
+
+## Best Practices
+
+- **Test with a draft first**: Create the migration as a draft and review the mappings carefully before finalising
+- **Migrate incrementally**: If you're making large changes, consider breaking them into smaller migration steps
+- **Communicate with model owners**: Let them know a migration is happening and that they may need to fill in any new
+ fields that don't have mappings from the old schema
+- **Check after migration**: Verify that the migrated data appears correctly in the model card form
+
+## Viewing Existing Migrations
+
+To see all migration plans:
+
+1. Navigate to **Schemas** from the navigation sidebar
+2. Select **Migrations**
+3. The list shows all migrations with their name, source schema, target schema, and draft/final status
+
+## Related Pages
+
+- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - What schemas are and how they work
+- [Creating a Schema](/docs/administration/schemas/create-a-schema) - How to author a new schema
+- [Uploading a Schema](/docs/administration/schemas/upload-a-schema) - How to upload a schema to Bailo
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/administration/schemas/understanding-schemas.mdx b/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
new file mode 100644
index 0000000000..77651724a7
--- /dev/null
+++ b/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
@@ -0,0 +1,97 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Understanding Schemas
+
+Schemas are the foundation of Bailo's governance model. They define the questions and structure of model cards and
+access request forms, ensuring that every model in your organisation is documented consistently.
+
+This page explains what schemas are and how they work. For step-by-step instructions on creating a schema, see
+[Creating a Schema](/docs/administration/schemas/create-a-schema).
+
+## What is a Schema?
+
+A schema is a template that defines:
+
+- What **questions** appear when someone fills in a model card or access request form
+- How those questions are **organised** into sections and tabs
+- Which questions are **required** and which are optional
+- What **format** answers should take (free text, dates, dropdowns, etc.)
+
+When a user creates a model or submits an access request, they select a schema. That schema then generates the form they
+fill in.
+
+## Schema Types
+
+There are three types of schema:
+
+| Type | Purpose |
+| ------------------ | --------------------------------------------------------------------------------------------------------------------------- |
+| **Model Card** | Defines the structure of model documentation - intended use, training details, performance metrics, limitations, etc. |
+| **Data Card** | Defines the fields for the information about the dataset - size, format, data source, known limitations or biases etc. |
+| **Access Request** | Defines the form users fill in when requesting access to a model - who is requesting, why, what permissions they need, etc. |
+
+## How Schemas Relate to Other Concepts
+
+```
+Schema ──defines──> Model Card Form
+Schema ──defines──> Data Card Form
+Schema ──defines──> Access Request Form
+Schema ──attached to──> Review Roles (which roles must approve)
+Model ──selects──> Schema (at setup time)
+Data Card ──selects──> Schema (at setup time)
+```
+
+When an administrator attaches review roles to a schema, every model that uses that schema will require those roles to
+be assigned and to approve releases and access requests.
+
+## Active vs Inactive Schemas
+
+Schemas can be **active** or **inactive**:
+
+- **Active** schemas appear in the selection list when users create new models or access requests
+- **Inactive** schemas are hidden from the selection list but continue to work for models that already use them
+
+This allows you to retire old schemas without breaking existing models.
+
+## Why Schemas Matter
+
+Without schemas, every model would be documented differently, making it difficult to:
+
+- Compare models against each other
+- Ensure governance requirements are met
+- Automate compliance checks
+- Maintain consistent quality across your model inventory
+
+Schemas give administrators control over what information is captured, while giving model owners a clear and structured
+form to fill in.
+
+## Schema Versioning and Migrations
+
+As your organisation's requirements evolve, you may need to update schemas. Rather than forcing model owners to re-enter
+all their information, Bailo supports **Schema Migrations** - plans that transform model card data from one schema
+version to another.
+
+See [Schema Migrations](/docs/administration/schemas/schema-migrations) for details.
+
+## Technical Details
+
+Schemas are built using [JSON Schema](https://json-schema.org/) and rendered using
+[React JSON Schema Form (RJSF)](https://rjsf-team.github.io/react-jsonschema-form/). This means schemas support:
+
+- Simple text fields, numbers, and dates
+- Dropdown selections and radio buttons
+- Conditional fields that appear based on other answers
+- Multi-section forms with tab navigation
+- Required field validation
+
+For technical instructions on writing schema JSON, see
+[Creating a Schema](/docs/administration/schemas/create-a-schema).
+
+## Related Pages
+
+- [Creating a Schema](/docs/administration/schemas/create-a-schema) - Step-by-step schema authoring guide
+- [Uploading a Schema](/docs/administration/schemas/upload-a-schema) - How to upload a schema to Bailo
+- [Schema Migrations](/docs/administration/schemas/schema-migrations) - Migrating data between schema versions
+- [Managing Review Roles](/docs/administration/review-roles/managing-review-roles) - Creating roles to attach to schemas
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/directory.tsx b/frontend/pages/docs/directory.tsx
index e2f50eeb6c..239af5b12d 100644
--- a/frontend/pages/docs/directory.tsx
+++ b/frontend/pages/docs/directory.tsx
@@ -11,12 +11,18 @@ export interface DirectoryEntry {
title: string
slug: string
header?: boolean
+ level?: number
}
export const flatDirectory: Array = [
// Main Docs
{ title: 'Overview', slug: '', header: true },
+ // Getting Started
+ { title: 'Getting Started', slug: 'getting-started', header: true },
+ { title: 'Quick Start Guide', slug: 'getting-started/quick-start' },
+ { title: 'Core Concepts', slug: 'getting-started/core-concepts' },
+
// Users
{ title: 'Users', slug: 'users', header: true },
@@ -28,26 +34,18 @@ export const flatDirectory: Array = [
{ title: 'Uploading Files', slug: 'users/managing-models-and-releases/upload-to-bailo/files' },
{ title: 'Uploading Images', slug: 'users/managing-models-and-releases/upload-to-bailo/images' },
+ { title: 'Data Cards', slug: 'users/data-cards', header: true },
+ { title: 'Creating a Data Card', slug: 'users/data-cards/creating-a-data-card' },
+ { title: 'Managing Data Cards', slug: 'users/data-cards/managing-data-cards' },
+
{ title: 'Using a Model', slug: 'users/using-a-model', header: true },
{ title: 'Requesting Access', slug: 'users/using-a-model/requesting-access' },
{ title: 'Personal Access Tokens', slug: 'users/using-a-model/personal-access-tokens' },
{ title: 'Using a Pushed Docker Image', slug: 'users/using-a-model/using-a-pushed-docker-image' },
{ title: 'Downloading files', slug: 'users/using-a-model/downloading-files' },
- { title: 'Using scanners', slug: 'users/using-scanners', header: true },
- { title: 'File scanning', slug: 'users/using-scanners/file-scanning' },
- { title: 'Image scanning', slug: 'users/using-scanners/image-scanning' },
-
- { title: 'Deletion', slug: 'users/deletion', header: true },
- { title: 'Deleting a File', slug: 'users/deletion/file-deletion' },
- { title: 'Deleting a Model', slug: 'users/deletion/model-deletion' },
- { title: 'Soft Deletion', slug: 'users/deletion/soft-deletion' },
-
- { title: 'Model Mirroring', slug: 'users/model-mirroring', header: true },
- { title: 'Creating a Mirrored Model', slug: 'users/model-mirroring/creating-a-mirrored-model' },
- { title: 'Editing a Mirrored Model Card', slug: 'users/model-mirroring/editing-a-mirrored-model-card' },
-
{ title: 'Reviews', slug: 'users/reviews', header: true },
+ { title: 'Understanding Reviews', slug: 'users/reviews/understanding-reviews' },
{ title: 'Reviewing Releases and Access Requests', slug: 'users/reviews/reviewing', header: true },
{ title: 'Reviewing a Release', slug: 'users/reviews/reviewing/releases' },
{ title: 'Reviewing an Access Request', slug: 'users/reviews/reviewing/access' },
@@ -55,11 +53,24 @@ export const flatDirectory: Array = [
{ title: 'Releases', slug: 'users/reviews/reviewed/releases' },
{ title: 'Access Requests', slug: 'users/reviews/reviewed/access-request' },
- { title: 'Programmatically using Bailo', slug: 'users/programmatically-using-bailo', header: true },
+ { title: 'Security Scanning', slug: 'users/using-scanners', header: true },
+ { title: 'File Scanning', slug: 'users/using-scanners/file-scanning' },
+ { title: 'Image Scanning', slug: 'users/using-scanners/image-scanning' },
+
+ { title: 'Model Mirroring', slug: 'users/model-mirroring', header: true },
+ { title: 'Creating a Mirrored Model', slug: 'users/model-mirroring/creating-a-mirrored-model' },
+ { title: 'Editing a Mirrored Model Card', slug: 'users/model-mirroring/editing-a-mirrored-model-card' },
+
+ { title: 'Deletion', slug: 'users/deletion', header: true },
+ { title: 'Deleting a File', slug: 'users/deletion/file-deletion' },
+ { title: 'Deleting a Model', slug: 'users/deletion/model-deletion' },
+ { title: 'Soft Deletion', slug: 'users/deletion/soft-deletion' },
+
+ { title: 'Programmatic Access', slug: 'users/programmatically-using-bailo', header: true },
{ title: 'Authentication', slug: 'users/programmatically-using-bailo/authentication' },
{ title: 'Open API', slug: 'users/programmatically-using-bailo/open-api' },
- { title: 'Webhooks', slug: 'users/programmatically-using-bailo/webhooks' },
{ title: 'Python Client', slug: 'users/programmatically-using-bailo/python-client' },
+ { title: 'Webhooks', slug: 'users/programmatically-using-bailo/webhooks' },
// Administration
{ title: 'Administration', slug: 'administration', header: true },
@@ -68,6 +79,17 @@ export const flatDirectory: Array = [
{ title: 'Getting Started', slug: 'administration/getting-started', header: true },
{ title: 'App Configuration', slug: 'administration/getting-started/app-configuration' },
+ /// Schema Management
+ { title: 'Schemas', slug: 'administration/schemas', header: true },
+ { title: 'Understanding Schemas', slug: 'administration/schemas/understanding-schemas' },
+ { title: 'Create a Schema', slug: 'administration/schemas/create-a-schema' },
+ { title: 'Upload a Schema', slug: 'administration/schemas/upload-a-schema' },
+ { title: 'Schema Migrations', slug: 'administration/schemas/schema-migrations' },
+
+ /// Review Roles
+ { title: 'Review Roles', slug: 'administration/review-roles', header: true },
+ { title: 'Managing Review Roles', slug: 'administration/review-roles/managing-review-roles' },
+
/// Microservices
{ title: 'Microservices', slug: 'administration/microservices', header: true },
{ title: 'Artefact Scanners', slug: 'administration/microservices/artefact-scanners' },
@@ -78,22 +100,23 @@ export const flatDirectory: Array = [
{ title: 'Configuration', slug: 'administration/helm/configuration' },
{ title: 'Isolated Environments', slug: 'administration/helm/isolated-environments' },
- /// Schema Management
- { title: 'Schema', slug: 'administration/schemas', header: true },
- { title: 'Create a Schema', slug: 'administration/schemas/create-a-schema' },
- { title: 'Upload a Schema', slug: 'administration/schemas/upload-a-schema' },
-
/// Migrations
{ title: 'Migrations', slug: 'administration/migrations', header: true },
{ title: 'Bailo v0.4', slug: 'administration/migrations/bailo-0.4' },
{ title: 'Bailo v2.0', slug: 'administration/migrations/bailo-2.0' },
{ title: 'DataBase Scripts', slug: 'administration/migrations/scripts' },
+
+ // Reference
+ { title: 'Reference', slug: 'reference', header: true },
+ { title: 'Glossary', slug: 'reference/glossary' },
+ { title: 'Roles & Permissions', slug: 'reference/roles-and-permissions' },
]
export interface DirectoryTree {
slug: string
title: string
header?: boolean
+ level: number
children?: DirectoryTree[]
}
@@ -102,6 +125,7 @@ function slugsToTree(paths: Array) {
slug: '',
title: 'Root',
header: true,
+ level: 0,
children: [],
}
@@ -112,6 +136,7 @@ function slugsToTree(paths: Array) {
let currentId = ''
for (const part of parts) {
+ const level = parts.indexOf(part) + 1
const isLastPart = part === parts[parts.length - 1]
const isFirstPart = part === parts[0]
@@ -128,6 +153,7 @@ function slugsToTree(paths: Array) {
slug: currentId,
title: path.title,
...(path.header ? { header: true } : {}),
+ level,
...(isLastPart ? {} : { children: [] }),
})
diff --git a/frontend/pages/docs/getting-started/core-concepts.mdx b/frontend/pages/docs/getting-started/core-concepts.mdx
new file mode 100644
index 0000000000..de822718df
--- /dev/null
+++ b/frontend/pages/docs/getting-started/core-concepts.mdx
@@ -0,0 +1,137 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Core Concepts
+
+This page explains the key building blocks of Bailo and how they relate to each other. Understanding these concepts will
+help you navigate the platform and make the most of its features.
+
+## Entry Types
+
+Everything in Bailo starts with an **Entry**. There are four types:
+
+| Entry Type | Description |
+| ------------------- | ----------------------------------------------------------------------------------------------------------- |
+| **Model** | A machine learning model with full lifecycle management - model card, releases, access control, and reviews |
+| **Data Card** | Documentation for a dataset, tracking its provenance, storage, and relationship to models |
+| **Mirrored Model** | A read-only copy of a model from another Bailo instance or external source |
+| **Untrusted Model** | A model flagged for additional scrutiny, with restricted capabilities |
+
+Some Entry types must be enabled by your Bailo administrator before they can be used.
+
+## The Lifecycle of a Model
+
+A model in Bailo follows a structured lifecycle:
+
+```
+Create Model → Select Schema → Fill In Model Card → Add Collaborators
+ → Upload Files / Images → Create Release → Review & Approval
+ → Consumers Request Access → Download / Pull
+```
+
+### 1. Model
+
+A **Model** is the top-level container. It has a name, description, visibility (public or private), and a list of
+collaborators. Creating a model is the first step.
+
+### 2. Schema
+
+A **Schema** defines the structure of a model card - what questions must be answered about a model. Schemas are created
+by administrators and selected when setting up a model. There are two kinds:
+
+- **Model Card schemas** define the metadata form for models
+- **Access Request schemas** define the form users fill in when requesting access
+
+### 3. Model Card
+
+The **Model Card** is the structured documentation attached to a model. It captures information like intended use,
+training methodology, known limitations, and performance metrics. The questions come from the selected schema.
+
+Model cards are versioned - each edit creates a new version, and you can view the history to see how documentation has
+evolved.
+
+### 4. Release
+
+A **Release** is a versioned snapshot of a model at a point in time. Releases use
+[semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`, `2.0.0`) and include:
+
+- A reference to a specific model card version
+- Attached files (model weights, configuration files, etc.)
+- Attached container images (e.g. Docker images)
+- Release notes
+
+Creating a release triggers the review process.
+
+### 5. Review
+
+When a release or access request is created, it enters a **Review** process. Reviewers assigned to the model evaluate
+the submission and either approve it or request changes. Reviews are driven by **Review Roles** - named roles like
+"Model Technical Reviewer" or "Model Senior Responsible Officer" that an administrator configures.
+
+A release is only approved when all required review roles have given their approval.
+
+### 6. Access Request
+
+To download files or pull container images from a model, users must create an **Access Request**. This submission goes
+through its own review process. Once approved, the user gains the permissions specified in the request.
+
+Some models may have **ungoverned access** enabled, which allows any user to download files without going through the
+access request process.
+
+## Roles and Permissions
+
+Bailo uses two systems of roles:
+
+### Entry Roles
+
+These are assigned per-model and control what actions a user can take:
+
+| Role | What It Allows |
+| --------------- | ---------------------------------------------------------------------------------------------------- |
+| **Owner** | Full control: edit model, manage collaborators, create releases, delete the model |
+| **Contributor** | Edit the model card, upload files and images, create releases |
+| **Consumer** | Download files and pull images (requires an approved access request, unless ungoverned access is on) |
+
+### Review Roles
+
+These are created by administrators and attached to schemas. When a model uses a schema with review roles, those roles
+must be assigned to specific people who will review releases and access requests. Common examples include:
+
+- **Model Technical Reviewer (MTR)** - reviews the technical quality of the model
+- **Model Senior Responsible Officer (MSRO)** - reviews governance and compliance aspects
+
+For a full reference, see [Roles & Permissions](/docs/reference/roles-and-permissions).
+
+## Visibility
+
+Models can be **Public** or **Private**:
+
+- **Public** models appear in the Marketplace and can be found by any user
+- **Private** models are only visible to users who have been explicitly added as collaborators
+
+Even for public models, downloading artefacts typically requires an approved access request.
+
+## Security Scanning
+
+Files and container images uploaded to Bailo are automatically scanned for security issues:
+
+- **Files** are scanned by ClamAV (malware detection) and ModelScan (serialisation attack detection)
+- **Container images** are scanned by Trivy (vulnerability detection with CVE reporting)
+
+Scan results are displayed alongside each file and image, with severity ratings.
+
+## Federation
+
+Bailo instances can be connected through **Federation**, allowing models from one instance to appear in another. This is
+useful for organisations with multiple deployments or for integrating with external model repositories like HuggingFace
+Hub.
+
+Federated models appear as **Mirrored Models** - read-only entries that stay in sync with their source.
+
+## What's Next?
+
+- [Quick Start Guide](/docs/getting-started/quick-start) - Walk through creating your first model
+- [Glossary](/docs/reference/glossary) - Definitions of all Bailo-specific terms
+- [Creating a Model](/docs/users/managing-models-and-releases/upload-to-bailo/creating-a-model) - Detailed model
+ creation guide
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/getting-started/quick-start.mdx b/frontend/pages/docs/getting-started/quick-start.mdx
new file mode 100644
index 0000000000..23ebd48829
--- /dev/null
+++ b/frontend/pages/docs/getting-started/quick-start.mdx
@@ -0,0 +1,125 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Quick Start Guide
+
+This guide walks you through the essential steps of using Bailo, from browsing models to creating your own. It should
+take around 15 minutes to complete.
+
+Before you begin, make sure you have access to your organisation's Bailo instance and can log in.
+
+## Step 1: Browse the Marketplace
+
+When you first log in, you'll see the **Marketplace**. This is where all public models and data cards are listed. You
+can:
+
+- **Search** for models by name using the search bar at the top
+- **Filter** using common properties, organisations, popular tags etc. shown below the search bar
+- **Switch tabs** between Models and Data Cards
+
+If you're looking for a specific model, try the search bar first. If you're exploring what's available, browse by tags
+or scroll through the list.
+
+## Step 2: Create a Model
+
+To add a new model to Bailo:
+
+1. Click the **+ Create** button in the top navigation bar or in the Marketplace
+2. Select **Model** as the entry type
+3. Fill in the required fields:
+ - **Model Name**: A clear, descriptive name for your model
+ - **Description**: What the model does and its intended use
+ - **Access control**: Choose **Public** (visible to all users) or **Private** (visible only to collaborators)
+4. Click **Create Model**
+
+Your model is now created and visible in the Marketplace (if public).
+
+## Step 3: Select a Schema and Fill In the Model Card
+
+After creating your model, you need to select a **schema**. A schema defines the questions you'll answer about your
+model - things like intended use, training details, known limitations, and performance metrics.
+
+1. You'll be prompted to select a schema from the available options
+2. Once selected, click **Edit model card** then a form appears with sections to fill in
+3. Work through each section, providing as much detail as you can
+4. Click **Save**
+
+The model card is the core documentation for your model. It helps reviewers and consumers understand what the model does
+and how it should be used.
+
+## Step 4: Add Collaborators and Reviewers
+
+Before creating a release, set up who can work with your model and who will review it:
+
+1. Navigate to the **Settings** tab on your model page
+2. Under **Access**, add users or groups as collaborators
+3. Assign roles:
+ - **Owner**: Full control over the model
+ - **Contributor**: Can edit the model card and upload files
+ - **Consumer**: Can download files and images (after access approval)
+4. Assign **Review Roles** (e.g. Model Technical Reviewer, Model Senior Responsible Officer) to the appropriate people
+5. Click **Save**
+
+## Step 5: Upload Model Files
+
+You can upload model artefacts (weights, configurations, data files) at any time:
+
+1. Go to the **File management** tab
+2. Click **Add new files** and select a file from your computer
+3. Optionally add tags to help organise your files
+4. Uploaded files can be attached to releases
+
+If enabled, files are automatically scanned for security issues after upload.
+
+## Step 6: Upload Container Images
+
+You can upload container images (e.g. Docker images) to the Bailo registry at any time:
+
+1. Go to the **Registry** tab on your model page
+2. Click **Push image**
+3. If you do not already have a user authentication token, click **Manage user tokens** and create one
+4. Log in to the registry using Docker:
+ - Use your access key as the username
+ - Use your user token as the password
+5. Tag your local image using the command shown in the dialog:
+ - Replace `` with your local image name and tag
+ - Replace `` with the image name you want to use in Bailo
+ - Replace `` with the image version tag
+6. Push the tagged image to the registry using the command shown in the dialog
+7. Uploaded container images can be attached to releases
+
+If enabled, images are automatically scanned for vulnerabilities after upload.
+
+## Step 7: Create a Release
+
+A release is a versioned snapshot of your model, including its files and documentation.
+
+1. Go to the **Releases** tab on your model page
+2. Click **Draft new release**
+3. Fill in:
+ - **Version**: Use semantic versioning (e.g. `1.0.0`)
+ - **Release notes**: Describe what's included in this release
+4. Attach any files and/or container images you've uploaded
+5. Click **Create Release**
+
+Creating a release triggers the review process. Your assigned reviewers will be notified.
+
+## Step 8: Review and Approval
+
+After creating a release, it enters the review process:
+
+1. Assigned reviewers receive notifications
+2. Reviewers examine the model card and release artefacts
+3. Each reviewer either **approves** or **requests changes**
+4. Once all required reviewers approve, the release is marked as approved
+
+You can check the status of your reviews from the **Review** page (accessible from the navigation sidebar).
+
+## What's Next?
+
+- [Core Concepts](/docs/getting-started/core-concepts) - Understand the data model and key terminology
+- [Requesting Access](/docs/users/using-a-model/requesting-access) - Learn how to request access to someone else's model
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Automate your workflow with the Python
+ client
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - Understand what each role can do
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/index.mdx b/frontend/pages/docs/index.mdx
index 54249e62bf..4a0689dd8e 100644
--- a/frontend/pages/docs/index.mdx
+++ b/frontend/pages/docs/index.mdx
@@ -8,12 +8,31 @@ does so in a **well controlled** and **low-risk** manner.
The service aims to:
-- Providing a centralised repository for machine learning models
+- Provide a centralised repository for machine learning models
- Encourage discovery and reuse of existing models
- Standardise model packaging and deployment
- Enforce consistent compliance and review processes
- Support monitoring and governance of operational models
+## Where to Start
+
+| If you are... | Start here |
+| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| **New to Bailo** | [Quick Start Guide](/docs/getting-started/quick-start) - Create your first model in ~15 minutes |
+| **Looking to understand how Bailo works** | [Core Concepts](/docs/getting-started/core-concepts) - The data model, roles, and workflows |
+| **A model consumer** | [Requesting Access](/docs/users/using-a-model/requesting-access) - How to get access to a model |
+| **Using the API or Python client** | [Programmatic Access](/docs/users/programmatically-using-bailo/authentication) - Authentication and client libraries |
+| **An administrator** | [App Configuration](/docs/administration/getting-started/app-configuration) - Setting up and configuring Bailo |
+
+## Documentation Sections
+
+- **Getting Started** - Quick start guide and core concepts for new users
+- **Users** - Guides for creating models, managing releases, requesting access, reviews, and more
+- **Administration** - Deployment, configuration, schema management, and review role setup
+- **Reference** - Glossary, roles and permissions, and troubleshooting
+
+## Contributing
+
All of this documentation is available on
[our GitHub repository](https://github.com/gchq/Bailo/tree/main/frontend/pages/docs). Contributions and corrections are
welcome.
diff --git a/frontend/pages/docs/reference/glossary.mdx b/frontend/pages/docs/reference/glossary.mdx
new file mode 100644
index 0000000000..ccf03859ce
--- /dev/null
+++ b/frontend/pages/docs/reference/glossary.mdx
@@ -0,0 +1,107 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Glossary
+
+Definitions of key terms used throughout Bailo.
+
+---
+
+**Access Request** - A formal request submitted by a user to gain permission to download files or pull container images
+from a model. Access requests go through a review process and must be approved before access is granted.
+
+**Artefact** - A general term for any file or container image associated with a model, including model weights,
+configuration files, training data, and container images.
+
+**ClamAV** - An open-source antivirus engine used by Bailo to scan uploaded files for malware.
+
+**Collaborator** - A user or group that has been granted a role (Owner, Contributor, or Consumer) on a specific model.
+
+**Consumer** - An entry role that allows a user to download files and pull container images from a model, provided they
+have an approved access request or the model has ungoverned access enabled.
+
+**Container image** (e.g. a Docker image) is a standalone, executable artefact used to create a container. This
+container image contains all the libraries, dependencies, and files that the container needs to run.
+
+**Contributor** - An entry role that allows a user to edit the model card, upload files and images, and create releases
+for a model.
+
+**Data Card** - An entry type for documenting datasets. Data cards capture information about data provenance, storage,
+and relationships to models.
+
+**Entry** - The top-level entity in Bailo. Models, Data Cards, Mirrored Models, and Untrusted Models are all types of
+entry.
+
+**Federation** - A feature that connects multiple Bailo instances (or external sources like HuggingFace Hub), allowing
+models from one to be browsed and mirrored in another.
+
+**Inference Service** - A running deployment of a model's container image within Bailo, providing a live endpoint for
+making predictions without downloading the model.
+
+**Marketplace** - The main browsing page in Bailo where users discover public models and data cards through search, tag
+filtering, and category browsing.
+
+**Mirrored Model** - A read-only copy of a model from another Bailo instance or external source. Mirrored models are
+kept in sync with their source and cannot be directly edited.
+
+**Model** - The primary entry type in Bailo. A model represents a machine learning model with its documentation (model
+card), versioned releases, files, container images, and access controls.
+
+**Model Card** - The structured documentation attached to a model. Its content is defined by the selected schema and
+typically includes intended use, training details, performance metrics, and known limitations. Model cards are
+versioned.
+
+**Model Senior Responsible Officer (MSRO)** - A commonly used review role representing the person responsible for
+governance and compliance decisions about a model. This is a configurable review role, not a fixed system role.
+
+**Model Technical Reviewer (MTR)** - A commonly used review role representing the person responsible for reviewing the
+technical quality of a model. This is a configurable review role, not a fixed system role.
+
+**ModelScan** - A security scanning tool used by Bailo to detect serialisation attacks in uploaded model files (e.g.
+malicious pickle files).
+
+**Owner** - An entry role that grants full control over a model: editing, managing collaborators, creating releases, and
+deleting the model.
+
+**Peer** - Another Bailo instance or external model repository connected through federation.
+
+**Personal Access Token (PAT)** - An API key pair (access key + secret key) that allows programmatic access to Bailo's
+API. Tokens can be scoped to specific models and actions.
+
+**Release** - A versioned snapshot of a model, using semantic versioning (e.g. `1.0.0`). Releases bundle together a
+model card version, uploaded files, container images, and release notes. Creating a release triggers the review process.
+
+**Review** - The evaluation process that releases and access requests go through before approval. Reviews are conducted
+by users assigned to review roles on the model.
+
+**Review Role** - An administrator-defined role (e.g. Model Technical Reviewer, Model Senior Responsible Officer) that
+is attached to schemas and assigned to specific people on each model. Review roles determine who must approve releases
+and access requests.
+
+**RJSF (React JSON Schema Form)** - The library Bailo uses to render dynamic forms from JSON Schema definitions. This is
+the underlying technology behind schemas and model cards.
+
+**Schema** - A JSON Schema definition that determines the structure and questions of a model card or access request
+form. Schemas are created by administrators and selected when setting up a model.
+
+**Schema Migration** - A plan for transforming model card data from one schema version to another, allowing schemas to
+evolve without losing existing data.
+
+**Semantic Versioning (Semver)** - A versioning convention used for releases: `MAJOR.MINOR.PATCH` (e.g. `1.2.3`). Major
+versions indicate breaking changes, minor versions add functionality, and patch versions fix issues.
+
+**Soft Deletion** - Bailo's deletion model where deleted items are marked as removed but not immediately destroyed.
+Administrators can recover soft-deleted items in exceptional circumstances.
+
+**Trivy** - An open-source vulnerability scanner used by Bailo to scan container images for known security
+vulnerabilities (CVEs).
+
+**Ungoverned Access** - A model setting that allows any user to download files and pull images without submitting an
+access request.
+
+**Untrusted Model** - An entry type for models that require additional scrutiny. Untrusted models may have restricted
+capabilities compared to standard models. This feature must be enabled by an administrator.
+
+**Webhook** - An HTTP callback that Bailo sends to an external URL when certain events occur (e.g. a release is created,
+an access request is submitted). Used for integrating Bailo with external systems.
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/reference/roles-and-permissions.mdx b/frontend/pages/docs/reference/roles-and-permissions.mdx
new file mode 100644
index 0000000000..acf48a9dec
--- /dev/null
+++ b/frontend/pages/docs/reference/roles-and-permissions.mdx
@@ -0,0 +1,141 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Roles and Permissions
+
+Bailo uses two complementary role systems: **Entry Roles** that control what actions a user can take on a model, and
+**Review Roles** that determine who must approve releases and access requests.
+
+## Entry Roles
+
+Every collaborator on a model is assigned one of three entry roles. These roles govern day-to-day interactions with the
+model.
+
+### Owner
+
+The **Owner** has full control over a model. There must be at least one owner on every model.
+
+Owners can:
+
+- Edit the model name, description, and visibility
+- Edit the model card
+- Manage collaborators (add, remove, change roles)
+- Upload and delete files
+- Push and delete container images (e.g. Docker images)
+- Create, edit, and delete releases
+- Create and manage access requests
+- Delete the model
+- Configure model settings (e.g. ungoverned access, template eligibility)
+
+### Contributor
+
+A **Contributor** can work on the model's content but cannot manage access or delete the model.
+
+Contributors can:
+
+- Edit the model card
+- Upload and delete files
+- Push container images
+- Create releases
+
+Contributors cannot:
+
+- Change model settings or visibility
+- Manage collaborators
+- Delete the model
+
+### Consumer
+
+A **Consumer** can access the model's artefacts for use, provided they have an approved access request (or the model has
+ungoverned access enabled).
+
+Consumers can:
+
+- View the model and its model card
+- Download files (with approved access request)
+- Pull container images (with approved access request)
+- Create access requests
+
+Consumers cannot:
+
+- Edit the model card
+- Upload files or images
+- Create releases
+
+## Permission Summary
+
+| Action | Owner | Contributor | Consumer | Public (no role) |
+| ---------------------- | ----- | ----------- | ------------------- | ---------------------- |
+| View public model | Yes | Yes | Yes | Yes |
+| View private model | Yes | Yes | Yes | No |
+| Edit model card | Yes | Yes | No | No |
+| Edit model settings | Yes | No | No | No |
+| Manage collaborators | Yes | No | No | No |
+| Upload files | Yes | Yes | No | No |
+| Delete files | Yes | Yes | No | No |
+| Push container images | Yes | Yes | No | No |
+| Create releases | Yes | Yes | No | No |
+| Delete releases | Yes | No | No | No |
+| Download files | Yes | Yes | With access request | With ungoverned access |
+| Pull container images | Yes | Yes | With access request | With ungoverned access |
+| Create access requests | Yes | Yes | Yes | No |
+| Delete model | Yes | No | No | No |
+
+## Review Roles
+
+Review roles are created by administrators and attached to schemas. Unlike entry roles, review roles are not fixed -
+your organisation can define whatever roles make sense for your governance process.
+
+### How Review Roles Work
+
+1. An administrator creates review roles (e.g. "Model Technical Reviewer", "Model Senior Responsible Officer")
+2. The administrator attaches these roles to a schema
+3. When a model uses that schema, the model owner assigns specific people to each review role
+4. When a release or access request is created, the assigned reviewers are notified
+5. Each review role must approve before the submission is considered fully approved
+
+### Common Review Roles
+
+While organisations can create any review roles they need, two are commonly used:
+
+- **Model Technical Reviewer (MTR)**: Reviews the technical quality of the model - architecture, training process,
+ evaluation metrics, and fitness for purpose
+- **Model Senior Responsible Officer (MSRO)**: Reviews governance and compliance aspects - data handling, ethical
+ considerations, risk assessment, and organisational policies
+
+### Review Role Properties
+
+Each review role has:
+
+| Property | Description |
+| -------------------- | --------------------------------------------------------------------- |
+| **Name** | Display name (e.g. "Model Technical Reviewer") |
+| **Short Name** | Abbreviated identifier (e.g. "mtr") |
+| **Description** | Explanation of the role's purpose |
+| **System Role** | The minimum entry role needed (owner, contributor, consumer, or none) |
+| **Default Entities** | Users or groups automatically assigned to this role on new models |
+
+### Who Can Review What?
+
+- **Release reviews** can be performed by any assigned review role
+- **Access request reviews** are typically restricted to specific review roles (commonly MSRO)
+
+The exact review requirements depend on how your administrator has configured the schemas and review roles.
+
+## Assigning Roles
+
+To assign all roles on a model:
+
+1. Open the model page
+2. Go to the **Settings** tab
+3. Under **Access**, search for users or groups
+4. Select the appropriate role(s)
+5. **Save** changes
+
+## Related Pages
+
+- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works
+- [Managing Review Roles](/docs/administration/review-roles/managing-review-roles) - Creating and configuring review
+ roles (administrators)
+- [Glossary](/docs/reference/glossary) - Definitions of all Bailo terms
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx b/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
new file mode 100644
index 0000000000..198d820b7f
--- /dev/null
+++ b/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
@@ -0,0 +1,79 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Creating a Data Card
+
+A **Data Card** documents a dataset used in machine learning - its provenance, storage location, contents, and
+relationship to models. Data cards help your organisation track what data is being used, where it comes from, and how it
+should be handled.
+
+## When to Use a Data Card
+
+Create a data card when you want to:
+
+- Document a training or evaluation dataset
+- Track data provenance and lineage
+- Record data storage locations and access requirements
+- Link datasets to the models that use them
+- Meet compliance or governance requirements around data handling
+
+## Creating a Data Card
+
+1. Click the **+ Create** button in the navigation bar
+2. Select **Data Card** as the entry type
+3. Fill in the required fields:
+ - **Data Card Name**: A clear, descriptive name for the dataset
+ - **Description**: What the dataset contains and its intended use
+ - **Access control**: Choose **Public** (visible to all users) or **Private** (visible only to collaborators)
+4. Click **Create data card**
+
+## Selecting a Schema
+
+After creating the data card, you'll be prompted to select a **schema**. The schema defines what information you need to
+provide about your dataset. Your administrator will have set up schemas appropriate for your organisation.
+
+Common fields in a data card schema might include:
+
+- Data source and collection methodology
+- Size and format
+- Storage location
+- Sensitivity classification
+- Retention period
+- Known limitations or biases
+
+## Filling In the Data Card
+
+Once you've selected a schema, the data card form appears. Click **Edit data card** then work through each section,
+providing as much detail as you can. The form is divided into tabs based on the schema structure.
+
+Click **Save** once you are happy with the form. This creates a new data card version which is automatically shown to
+anyone viewing the data card.
+
+## Using the Python Client
+
+You can also create and manage data cards programmatically using the Python client:
+
+```python
+from bailo import Client, Datacard
+
+client = Client("https://your-bailo-instance.com")
+
+# Create a new data card
+data_card = Datacard.create(
+ client=client,
+ name="Training Dataset v2",
+ description="Curated training data for image classification",
+)
+
+# Update the data card metadata
+data_card.update_data_card(metadata={"overview": {"tags": ["image", "classification"]}})
+```
+
+A full example is available in the [Data Cards demo notebook](/docs/python/notebooks/datacards_demo/index.html).
+
+## Related Pages
+
+- [Managing Data Cards](/docs/users/data-cards/managing-data-cards) - Editing, versioning, and linking data cards
+- [Core Concepts](/docs/getting-started/core-concepts) - How data cards fit into the Bailo data model
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Programmatic access to Bailo
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/data-cards/managing-data-cards.mdx b/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
new file mode 100644
index 0000000000..f6e9335699
--- /dev/null
+++ b/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
@@ -0,0 +1,73 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Managing Data Cards
+
+Once a data card has been created, you can edit its content, view its version history, manage collaborators, and link it
+to models.
+
+## Editing a Data Card
+
+To edit a data card:
+
+1. Navigate to the data card page
+2. The **Overview** tab shows the current content
+3. Click **Edit data card** and edit any section of the data card form
+4. Click **Save** to create a new version
+
+## Viewing Version History
+
+Data cards are versioned - every edit creates a new version. To view the history:
+
+1. Open the data card page
+2. Navigate to the version history
+3. Select a previous version to view what the data card looked like at that point in time
+
+This is useful for tracking how documentation has evolved and understanding what changed between versions.
+
+## Managing Collaborators
+
+Like models, data cards have collaborators with assigned roles:
+
+1. Navigate to the **Settings** tab on the data card page
+2. Under **Access**, search for users or groups to add as collaborators
+3. Assign an appropriate role:
+ - **Owner**: Full control, including editing and deleting the data card
+ - **Contributor**: Can edit the data card content
+ - **Consumer**: Can view the data card
+
+## Changing the Schema
+
+It is not possible to directly switch the schema used by a data card, however it is possible for a newer schema to be
+published by the Bailo administrators (for example, if your organisation has updated its data governance requirements).
+See [Schema Migrations](/docs/administration/schemas/schema-migrations) for further details. Note that changing schemas
+may require you to re-enter some information if the new schema has different fields.
+
+## Linking Data Cards to Models
+
+Data cards and models can reference each other to maintain traceability between datasets and the models trained on them.
+When filling in a model card, look for fields that allow you to reference related data cards.
+
+## Using the Python Client
+
+```python
+from bailo import Client, Datacard
+
+client = Client("https://your-bailo-instance.com")
+
+# Get an existing data card
+data_card = Datacard.from_id(client=client, data_card_id="my-data-card-id")
+
+# Update metadata
+data_card.update_data_card(metadata={"overview": {"tags": ["updated"]}})
+
+# Get the current data card content
+card = data_card.data_card
+```
+
+## Related Pages
+
+- [Creating a Data Card](/docs/users/data-cards/creating-a-data-card) - How to create a new data card
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - What each role allows
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Full programmatic access guide
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
index fce6c1267f..4288fdecbd 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
@@ -2,10 +2,10 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Python Client
-Bailo provides a Python client that wraps key API endpoints. The package is published on
+Bailo provides a Python client that wraps the API into high-level helper classes. The package is published on
[PyPI](https://pypi.org/project/bailo/).
-**You can find the full Python documentation [here](../../python/index.html).**
+**Full API documentation is available [here](../../python/index.html).**
## Installation
@@ -13,24 +13,232 @@ Bailo provides a Python client that wraps key API endpoints. The package is publ
pip install bailo
```
-## Why use the Python Client?
+For MLflow integration:
-The Python client integrates cleanly with Python tooling and is ideal for:
+```bash
+pip install bailo[mlflow]
+```
+
+## Authentication
+
+Before using the client, you need to set up authentication. Bailo supports two methods:
+
+### PKI Certificate Authentication (Recommended)
+
+Use a client certificate for mutual TLS:
+
+```python
+from bailo import Client, PkiAgent
+
+agent = PkiAgent(
+ cert="path/to/client-cert.pem",
+ key="path/to/client-key.pem",
+ auth="path/to/ca-cert.pem",
+)
+client = Client(
+ url="https://your-bailo-instance.com",
+ agent=agent,
+)
+```
+
+### Token-based Authentication
+
+Use a Personal Access Token created in Bailo's Settings page:
+
+```python
+from bailo import Client, TokenAgent
+
+agent = TokenAgent(
+ access_key="your-access-key",
+ secret_key="your-secret-key",
+)
+client = Client(
+ url="https://your-bailo-instance.com",
+ agent=agent,
+)
+```
-- Notebooks and experimentation
-- Automation and scripting
-- Integrating Bailo into ML workflows
+## Helper Classes
-### Scripting and Automation
+The Python client provides high-level helper classes that simplify common workflows:
-This Python Client provides a better way to add additional Bailo functionality to projects.
+| Class | Purpose |
+| --------------- | ----------------------------------------------- |
+| `Model` | Create, retrieve, and manage models |
+| `Datacard` | Create and manage data cards |
+| `Release` | Create versioned releases with files and images |
+| `AccessRequest` | Submit and manage access requests |
+| `Schema` | Create and retrieve schemas |
+| `Experiment` | Track experiments and metrics |
+
+## Common Workflows
+
+### Creating a Model
+
+```python
+from bailo import Client, Model, TokenAgent
+
+agent = TokenAgent(access_key="...", secret_key="...")
+client = Client(url="https://your-bailo-instance.com", agent=agent)
+
+# Create a new model
+model = Model.create(
+ client=client,
+ name="My Image Classifier",
+ description="A CNN for image classification",
+)
+
+print(f"Model created with ID: {model.model_id}")
+
+# Set up the model card from a schema
+model.card_from_schema(schema_id="your-schema-id")
+
+# Update the model card metadata
+model.update_model_card(metadata={
+ "overview": {
+ "tags": ["image-classification", "cnn"],
+ }
+})
+```
+
+### Creating a Release and Uploading Files
+
+```python
+from bailo import Release
+
+# Upload a file to the model
+with open("model_weights.pt", "rb") as f:
+ model_file_id = client.simple_upload(
+ model_id=model.model_id,
+ name="model_weights.pt",
+ buffer=f,
+ )
+
+# Create a release
+release = Release.create(
+ client=client,
+ model_id=model.model_id,
+ version="1.0.0",
+ notes="Initial release with trained weights",
+ model_card_version=model.card_version,
+ files=[model_file_id],
+ draft=True,
+)
+
+print(f"Release {release.version} created")
+```
-### Using Bailo with MLflow
+### Downloading Files
-Optional extras are provided for integration with [MLflow](https://mlflow.org/docs/latest/ml/).
+```python
+# Download a specific file
+release.download("model_weights.pt", output_dir="./downloads")
+
+# Download all files from a release
+release.download_all(output_dir="./downloads")
+```
+
+### Managing Access Requests
+
+```python
+from bailo import AccessRequest
+
+# Create an access request
+access_request = AccessRequest.create(
+ client=client,
+ model_id="target-model-id",
+ schema_id="access-request-schema-id",
+ metadata={
+ "overview": {
+ "name": "Research access",
+ "entities": ["user:your-username"],
+ }
+ },
+)
+```
+
+### Working with Data Cards
+
+```python
+from bailo import Datacard
+
+# Create a data card
+data_card = Datacard.create(
+ client=client,
+ name="Training Dataset v2",
+ description="Curated training data for image classification",
+)
+
+# Set up data card from a schema
+data_card.card_from_schema(schema_id="data-card-schema-id")
+```
+
+### Working with Schemas
+
+```python
+from bailo import Schema
+
+# Get all available model schemas
+schemas = Schema.get_all(client=client, kind="model")
+
+for schema in schemas:
+ print(f"{schema.name} (ID: {schema.schema_id})")
+
+# Create a new schema
+schema = Schema.create(
+ client=client,
+ schema_id="my-new-schema",
+ name="My Model Card Schema",
+ description="Custom schema for our team's models",
+ kind="model",
+ json_schema={"type": "object", "properties": {...}},
+)
+```
+
+## Jupyter Notebook Examples
+
+Detailed, runnable examples are available as Jupyter notebooks:
+
+- [Models and Releases (PyTorch)](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html) - End-to-end model
+ creation, file upload, and release management
+- [Access Requests](/docs/python/notebooks/access_requests_demo/index.html) - Submitting and managing access requests
+- [Data Cards](/docs/python/notebooks/datacards_demo/index.html) - Creating and updating data cards
+- [Schemas](/docs/python/notebooks/schemas_demo/index.html) - Schema creation and management
+- [Experiment Tracking](/docs/python/notebooks/experiment_tracking_demo/index.html) - Tracking experiments and metrics
+
+## MLflow Integration
+
+The optional MLflow integration allows you to log models from MLflow directly to Bailo:
```bash
pip install bailo[mlflow]
```
+This enables workflows where you train a model using MLflow's tracking capabilities and then publish the resulting
+artefacts to Bailo for governance and distribution.
+
+## Low-Level Client Methods
+
+For advanced use cases, the `Client` class exposes lower-level methods that map directly to API endpoints:
+
+| Category | Methods |
+| ------------------- | ------------------------------------------------------------------------------------------------------------------- |
+| **Models** | `post_model`, `get_model`, `get_models`, `patch_model`, `delete_model` |
+| **Model Cards** | `get_model_card`, `put_model_card`, `model_card_from_schema`, `model_card_from_template` |
+| **Releases** | `post_release`, `get_release`, `get_all_releases`, `put_release`, `delete_release` |
+| **Files** | `simple_upload`, `get_files`, `get_download_file`, `get_download_by_filename`, `delete_file` |
+| **Access Requests** | `post_access_request`, `get_access_request`, `get_access_requests`, `patch_access_request`, `delete_access_request` |
+| **Schemas** | `get_all_schemas`, `get_schema`, `post_schema` |
+| **Reviews** | `get_reviews`, `post_release_review`, `post_access_request_review` |
+| **Scanning** | `put_file_scan`, `put_image_scan` |
+| **Roles** | `get_model_roles` |
+
+Refer to the [full API documentation](../../python/index.html) for detailed method signatures and parameters.
+
+## Related Pages
+
+- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Detailed authentication setup
+- [Personal Access Tokens](/docs/users/using-a-model/personal-access-tokens) - Creating tokens for API access
+- [OpenAPI Reference](/docs/users/programmatically-using-bailo/open-api) - REST API documentation
+
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/reviews/understanding-reviews.mdx b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
new file mode 100644
index 0000000000..842ca4f116
--- /dev/null
+++ b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
@@ -0,0 +1,93 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Understanding the Review Process
+
+Reviews are Bailo's governance mechanism. They ensure that models and access requests are examined by the right people
+before they are approved. This page explains how the review system works end-to-end.
+
+## What Triggers a Review?
+
+Reviews are created automatically when:
+
+- A **release** is created for a model - the release enters review and must be approved before it is considered final
+- An **access request** is submitted - the request must be approved before the user gains download or pull permissions
+
+You do not need to manually create a review. The system handles this based on the review roles configured on the model.
+
+## Who Reviews What?
+
+Review assignments are determined by three things:
+
+1. **The schema** attached to the model defines which review roles are required (e.g. "Model Technical Reviewer", "Model
+ Senior Responsible Officer")
+2. **The model owner** assigns specific people or groups to each review role in the model's Settings tab
+3. **The type of submission** determines which roles participate:
+ - **Release reviews**: All assigned review roles participate
+ - **Access request reviews**: Typically only specific roles (commonly the MSRO) participate
+
+## The Review Lifecycle
+
+### For Releases
+
+1. A model owner or contributor creates a new release
+2. Bailo creates review tasks for each required review role
+3. Assigned reviewers are notified
+4. Each reviewer examines the release and the model card, then either:
+ - **Approves** - confirms the release meets their requirements
+ - **Requests changes** - explains what needs to be fixed
+5. If changes are requested, the model owner updates the release and the reviewer re-evaluates
+6. Once **all** required review roles have approved, the release is fully approved
+
+### For Access Requests
+
+1. A user submits an access request for a model
+2. Bailo creates a review task for the appropriate review role(s)
+3. The reviewer examines the request details and either approves or requests changes
+4. Once approved, the requesting user gains the permissions to download files and pull images
+
+## Checking Your Reviews
+
+To see reviews assigned to you:
+
+1. Click **Review** in the navigation bar
+2. The **Open** tab shows reviews waiting for your action, with a count badge
+3. The **Archived** tab shows completed reviews
+
+## Responding to a Review
+
+When reviewing a release or access request:
+
+1. Open the review from the Reviews page or from the model's release/access request page
+2. Examine the submission - for releases, review the model card and attached artefacts
+3. Add a **comment** explaining your assessment
+4. Choose your decision:
+ - **Approve** - you are satisfied with the submission
+ - **Request changes** - something needs to be addressed before you can approve
+5. Submit your response
+
+You can also react to other reviewers' comments to indicate agreement or add further context.
+
+## Review Outcomes
+
+| Outcome | What It Means |
+| --------------------- | ----------------------------------------------------------------------------------------- |
+| **Approved** | All required review roles have approved. The release or access request is finalised. |
+| **Changes requested** | One or more reviewers need something addressed. The submitter should update and resubmit. |
+| **Pending** | The review is still in progress - not all required roles have responded yet. |
+
+## Tips for Model Owners
+
+- **Assign reviewers early** - set up review role assignments in your model's Settings tab before creating your first
+ release
+- **Provide thorough model cards** - the more detail you provide, the faster reviews will go
+- **Monitor your reviews** - check the Reviews page regularly or watch for email notifications
+
+## Related Pages
+
+- [Reviewing a Release](/docs/users/reviews/reviewing/releases) - Step-by-step guide for reviewers
+- [Reviewing an Access Request](/docs/users/reviews/reviewing/access) - How to review access requests
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - Understanding review roles and entry roles
+- [Managing Review Roles](/docs/administration/review-roles/managing-review-roles) - Creating and configuring review
+ roles (administrators)
+
+export default ({ children }) => {children}
diff --git a/frontend/src/docs/DocsWrapper.tsx b/frontend/src/docs/DocsWrapper.tsx
index 09581ee51e..bec7fd88cf 100644
--- a/frontend/src/docs/DocsWrapper.tsx
+++ b/frontend/src/docs/DocsWrapper.tsx
@@ -69,6 +69,12 @@ export default function DocsWrapper({ children }: DocsWrapperProps): ReactElemen
const path = `/docs/${doc.slug}`
const isSelected = pathname === path
+ const headerFontSize =
+ {
+ 1: theme.typography.h6.fontSize,
+ 2: theme.typography.subtitle1.fontSize,
+ }[doc.level] ?? theme.typography.body2.fontSize
+
return (
{doc.header && doc.slug ? (
@@ -76,7 +82,10 @@ export default function DocsWrapper({ children }: DocsWrapperProps): ReactElemen
@@ -98,7 +107,7 @@ export default function DocsWrapper({ children }: DocsWrapperProps): ReactElemen
)
},
- [pathname],
+ [pathname, theme.typography.body2.fontSize, theme.typography.h6.fontSize, theme.typography.subtitle1.fontSize],
)
const currentIndex = useMemo(
From 3ba29120b5c1a739fd207268253b61adc517d24a Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Tue, 19 May 2026 15:14:00 +0000
Subject: [PATCH 03/23] PR suggestions
---
.../administration/review-roles/managing-review-roles.mdx | 4 ++--
frontend/src/docs/DocsWrapper.tsx | 8 ++++++--
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
index e64df108a7..4d2c29862c 100644
--- a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
+++ b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
@@ -24,9 +24,9 @@ To create a new review role:
| Field | Description | Example |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
| **Name** | The display name for the role | Model Technical Reviewer |
-| **Short Name** | A brief identifier used internally | mtr |
+| **Short Name** | A brief identifier used internally | `mtr` |
| **Description** | What this role is responsible for reviewing | Reviews the technical quality and fitness for purpose of models |
-| **System Role** | The minimum entry role a user must have to be assigned this review role. Options: Owner, Contributor, Consumer, or none | Contributor |
+| **System Role** | The minimum entry role a user must have to be assigned this review role. Options: Owner, Contributor, Consumer, or none | `Contributor` |
| **Default collaborators** | Users or groups automatically assigned to this role when new models are created | `team-leads` |
4. Click **Submit**
diff --git a/frontend/src/docs/DocsWrapper.tsx b/frontend/src/docs/DocsWrapper.tsx
index bec7fd88cf..94916e1051 100644
--- a/frontend/src/docs/DocsWrapper.tsx
+++ b/frontend/src/docs/DocsWrapper.tsx
@@ -96,7 +96,7 @@ export default function DocsWrapper({ children }: DocsWrapperProps): ReactElemen
@@ -110,6 +110,10 @@ export default function DocsWrapper({ children }: DocsWrapperProps): ReactElemen
[pathname, theme.typography.body2.fontSize, theme.typography.h6.fontSize, theme.typography.subtitle1.fontSize],
)
+ const docList = () => {
+ return {createDocElement(directory)}
+ }
+
const currentIndex = useMemo(
() => flatDirectory.findIndex((item) => item.slug === pathname.replace(/^(\/docs\/)/, '')),
[pathname],
@@ -151,7 +155,7 @@ export default function DocsWrapper({ children }: DocsWrapperProps): ReactElemen
position={{ xs: 'relative', sm: 'fixed' }}
height={{ xs: '250px', sm: 'calc(100vh - 80px)' }}
>
- {createDocElement(directory)}
+ {docList()}
From fdf47757a480cab77e8c6f6b485e7daa319e7b21 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Wed, 20 May 2026 15:45:10 +0000
Subject: [PATCH 04/23] More docs rewritten and moved about
---
frontend/pages/docs/directory.tsx | 21 ++-
.../docs/getting-started/core-concepts.mdx | 3 +-
.../pages/docs/reference/troubleshooting.mdx | 126 ++++++++++++++++++
.../authentication.mdx | 110 ++++++++++++---
.../programmatically-using-bailo/open-api.mdx | 61 ++++++++-
.../personal-access-tokens.mdx | 118 ++++++++++++++++
.../python-client.mdx | 3 +-
.../programmatically-using-bailo/webhooks.mdx | 98 ++++++++++++--
.../docs/users/reviews/review-outcomes.mdx | 73 ++++++++++
.../users/reviews/reviewed/access-request.mdx | 20 ---
.../docs/users/reviews/reviewed/releases.mdx | 30 -----
.../docs/users/reviews/reviewing/access.mdx | 43 +++++-
.../docs/users/reviews/reviewing/releases.mdx | 51 ++++++-
.../users/reviews/understanding-reviews.mdx | 4 +-
.../untrusted-models/untrusted-models.mdx | 54 ++++++++
.../browsing-the-marketplace.mdx | 76 +++++++++++
.../using-a-model/personal-access-tokens.mdx | 29 ----
17 files changed, 785 insertions(+), 135 deletions(-)
create mode 100644 frontend/pages/docs/reference/troubleshooting.mdx
create mode 100644 frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
create mode 100644 frontend/pages/docs/users/reviews/review-outcomes.mdx
delete mode 100644 frontend/pages/docs/users/reviews/reviewed/access-request.mdx
delete mode 100644 frontend/pages/docs/users/reviews/reviewed/releases.mdx
create mode 100644 frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
create mode 100644 frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
delete mode 100644 frontend/pages/docs/users/using-a-model/personal-access-tokens.mdx
diff --git a/frontend/pages/docs/directory.tsx b/frontend/pages/docs/directory.tsx
index 239af5b12d..8bd6878543 100644
--- a/frontend/pages/docs/directory.tsx
+++ b/frontend/pages/docs/directory.tsx
@@ -39,19 +39,17 @@ export const flatDirectory: Array = [
{ title: 'Managing Data Cards', slug: 'users/data-cards/managing-data-cards' },
{ title: 'Using a Model', slug: 'users/using-a-model', header: true },
+ { title: 'Browsing the Marketplace', slug: 'users/using-a-model/browsing-the-marketplace' },
{ title: 'Requesting Access', slug: 'users/using-a-model/requesting-access' },
- { title: 'Personal Access Tokens', slug: 'users/using-a-model/personal-access-tokens' },
{ title: 'Using a Pushed Docker Image', slug: 'users/using-a-model/using-a-pushed-docker-image' },
- { title: 'Downloading files', slug: 'users/using-a-model/downloading-files' },
+ { title: 'Downloading Files', slug: 'users/using-a-model/downloading-files' },
{ title: 'Reviews', slug: 'users/reviews', header: true },
{ title: 'Understanding Reviews', slug: 'users/reviews/understanding-reviews' },
- { title: 'Reviewing Releases and Access Requests', slug: 'users/reviews/reviewing', header: true },
+ { title: 'Reviewing', slug: 'users/reviews/reviewing', header: true },
{ title: 'Reviewing a Release', slug: 'users/reviews/reviewing/releases' },
{ title: 'Reviewing an Access Request', slug: 'users/reviews/reviewing/access' },
- { title: 'Reviewed Releases and Access Requests', slug: 'users/reviews/reviewed', header: true },
- { title: 'Releases', slug: 'users/reviews/reviewed/releases' },
- { title: 'Access Requests', slug: 'users/reviews/reviewed/access-request' },
+ { title: 'Review Outcomes', slug: 'users/reviews/review-outcomes' },
{ title: 'Security Scanning', slug: 'users/using-scanners', header: true },
{ title: 'File Scanning', slug: 'users/using-scanners/file-scanning' },
@@ -61,6 +59,9 @@ export const flatDirectory: Array = [
{ title: 'Creating a Mirrored Model', slug: 'users/model-mirroring/creating-a-mirrored-model' },
{ title: 'Editing a Mirrored Model Card', slug: 'users/model-mirroring/editing-a-mirrored-model-card' },
+ { title: 'Untrusted Models', slug: 'users/untrusted-models', header: true },
+ { title: 'Untrusted Models', slug: 'users/untrusted-models/untrusted-models' },
+
{ title: 'Deletion', slug: 'users/deletion', header: true },
{ title: 'Deleting a File', slug: 'users/deletion/file-deletion' },
{ title: 'Deleting a Model', slug: 'users/deletion/model-deletion' },
@@ -68,8 +69,9 @@ export const flatDirectory: Array = [
{ title: 'Programmatic Access', slug: 'users/programmatically-using-bailo', header: true },
{ title: 'Authentication', slug: 'users/programmatically-using-bailo/authentication' },
- { title: 'Open API', slug: 'users/programmatically-using-bailo/open-api' },
+ { title: 'Personal Access Tokens', slug: 'users/programmatically-using-bailo/personal-access-tokens' },
{ title: 'Python Client', slug: 'users/programmatically-using-bailo/python-client' },
+ { title: 'OpenAPI Reference', slug: 'users/programmatically-using-bailo/open-api' },
{ title: 'Webhooks', slug: 'users/programmatically-using-bailo/webhooks' },
// Administration
@@ -106,10 +108,15 @@ export const flatDirectory: Array = [
{ title: 'Bailo v2.0', slug: 'administration/migrations/bailo-2.0' },
{ title: 'DataBase Scripts', slug: 'administration/migrations/scripts' },
+ // API Reference
+ { title: 'API Reference', slug: 'api-reference', header: true },
+ { title: 'Overview', slug: 'api-reference/overview' },
+
// Reference
{ title: 'Reference', slug: 'reference', header: true },
{ title: 'Glossary', slug: 'reference/glossary' },
{ title: 'Roles & Permissions', slug: 'reference/roles-and-permissions' },
+ { title: 'Troubleshooting & FAQ', slug: 'reference/troubleshooting' },
]
export interface DirectoryTree {
diff --git a/frontend/pages/docs/getting-started/core-concepts.mdx b/frontend/pages/docs/getting-started/core-concepts.mdx
index de822718df..57c15b0558 100644
--- a/frontend/pages/docs/getting-started/core-concepts.mdx
+++ b/frontend/pages/docs/getting-started/core-concepts.mdx
@@ -131,7 +131,6 @@ Federated models appear as **Mirrored Models** - read-only entries that stay in
- [Quick Start Guide](/docs/getting-started/quick-start) - Walk through creating your first model
- [Glossary](/docs/reference/glossary) - Definitions of all Bailo-specific terms
-- [Creating a Model](/docs/users/managing-models-and-releases/upload-to-bailo/creating-a-model) - Detailed model
- creation guide
+- [Creating a Model](/docs/users/models/creating-a-model) - Detailed model creation guide
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/reference/troubleshooting.mdx b/frontend/pages/docs/reference/troubleshooting.mdx
new file mode 100644
index 0000000000..f732e64def
--- /dev/null
+++ b/frontend/pages/docs/reference/troubleshooting.mdx
@@ -0,0 +1,126 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Troubleshooting and FAQ
+
+Common issues and answers for Bailo users and administrators.
+
+## Models and the Marketplace
+
+### I can't see a model in the Marketplace
+
+- **Private models** are only visible to collaborators. Ask the model owner to add you, or check whether the model is
+ set to public.
+- **Filters may be active.** Clear any search terms, tag filters, or organisation filters.
+- If the model was recently created, try refreshing the page.
+
+### I can't edit a model
+
+- Only **Owners** and **Contributors** can edit model cards. Check your role on the model's Settings tab.
+- If you need access, ask the model owner to add you as a collaborator.
+
+### I can't delete a model
+
+- Only the model **Owner** can delete a model.
+- Deletion is permanent for the model and all its associated releases, files, and access requests.
+
+## Releases
+
+### My release is stuck in review
+
+- Check that **all required review roles** have been assigned to specific people in the model's Settings tab.
+- If reviewers haven't been assigned, no one will be notified of the review.
+- Contact the assigned reviewers directly if the review has been pending for a long time.
+
+### I can't create a release
+
+- Only **Owners** and **Contributors** can create releases.
+- Make sure you have filled in the required fields: version (semver format), and release notes.
+
+## Access Requests
+
+### My access request hasn't been approved
+
+- Access requests are reviewed by the Model Senior Responsible Officer (or equivalent review role). Check who is
+ assigned to that role in the model's Settings tab.
+- Contact the reviewer directly if the request has been pending.
+
+### I can't download files even though I have access
+
+- Your access request must be **approved**, not just submitted.
+- Check the status of your access request on the model page.
+- If the model has **ungoverned access** enabled, you should be able to download without an access request.
+
+## Container (Docker) Images
+
+### I can't push a container image
+
+- Make sure you're using the correct registry address (check with your administrator).
+- Verify your personal access token has the `image:push` permission.
+- Ensure your token is scoped to the correct model (or set to "All models").
+- Check that you're logged into the registry with `docker login`.
+
+### I can't pull a container image
+
+- You need an **approved access request** for the model (unless ungoverned access is enabled).
+- Verify your personal access token has the `image:read` permission.
+- Check the registry address is correct.
+
+## Personal Access Tokens
+
+### How do I create a token?
+
+Navigate to **User (top right) > Settings > Authentication** and click **Add token**. See
+[Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) for details.
+
+### I lost my secret key
+
+Secret keys are only shown once when the token is created. If you've lost it, delete the old token and create a new one.
+
+### My token isn't working
+
+- Check that the token has the correct **permissions** for the action you're trying to perform.
+- Check that the token is **scoped to the correct model** (or set to "All models").
+- Verify you're using the correct access key and secret key pair.
+
+## Schemas and Forms
+
+### Schema validation errors when filling in a model card
+
+- Required fields are marked - make sure all required fields are filled in.
+- Check that dates are in the correct format.
+- If a field appears read-only, it may be controlled by a dependency on another field's value.
+
+### I can't see a schema when creating a model
+
+- Only **active** schemas appear in the selection list. An administrator may have deactivated the schema.
+- Contact your administrator if you need a specific schema.
+
+## Security Scanning
+
+### A file scan shows issues
+
+- **ClamAV** detects malware. If a file is flagged, do not distribute it until the issue is investigated.
+- **ModelScan** detects serialisation attacks (e.g. in pickle files). Review the flagged file for unsafe deserialisation
+ patterns.
+- You can **rescan** a file after a cooldown period if you believe the result is a false positive.
+
+### A container image scan shows vulnerabilities
+
+- **Trivy** reports known vulnerabilities (CVEs) with severity ratings.
+- Review the vulnerability details to determine impact.
+- Update base images or dependencies to address critical vulnerabilities.
+- You can rescan an image after updating it.
+
+## Administration
+
+### How do I contact an administrator?
+
+Check the **Help** page in Bailo for support links and contact information specific to your deployment.
+
+## Related Pages
+
+- [Quick Start Guide](/docs/getting-started/quick-start) - Getting started with Bailo
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - Understanding what each role allows
+- [Glossary](/docs/reference/glossary) - Definitions of Bailo terms
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
index c3c2b3400f..3c78a7f319 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
@@ -7,58 +7,126 @@ import tokens from 'public/docs/bailo_tokens.png'
# Programmatic Authentication with Bailo
+Bailo supports two authentication methods for programmatic access: PKI certificates and personal access tokens. Choose
+the method that suits your environment.
+
+## Which Method Should I Use?
+
+| Method | Best for | Requirements |
+| ---------------------- | ---------------------------------------------------------- | ----------------------------------------------- |
+| **PKI (certificates)** | Organisations with PKI infrastructure, automated pipelines | Client certificate, private key, CA certificate |
+| **Token-based** | Individual users, quick setup, scoped access | A Bailo account to generate tokens |
+
## Public Key Infrastructure (PKI)
-Bailo supports PKI‑based authentication. The Python client can sign requests using certificates.
+PKI-based authentication uses client certificates to sign requests. This is the recommended method for environments
+where mutual TLS is standard.
+
+### Setup
+
+You will need:
+
+- A **client certificate** (`.pem` file)
+- A **private key** (`.pem` file)
+- A **certificate authority (CA) file** (`.pem` file)
+
+### Using PKI with the Python Client
```python
from bailo import PkiAgent, Client
-pki_agent = PkiAgent()
-
-Client(
- "http://127.0.0.1:8080",
- cert="path/to/cert.pem",
- key="path/to/key.pem",
- auth="path/to/certificate/authority/file.pem"
+agent = PkiAgent(
+ cert="path/to/client-cert.pem",
+ key="path/to/client-key.pem",
+ auth="path/to/ca-cert.pem",
)
+
+client = Client("https://your-bailo-instance.com", agent=agent)
```
-## Token‑based authentication
+### Using PKI with curl
+
+```bash
+curl --cert path/to/client-cert.pem \
+ --key path/to/client-key.pem \
+ --cacert path/to/ca-cert.pem \
+ https://your-bailo-instance.com/api/v2/models/search
+```
+
+## Token-based Authentication
+
+If you are not using PKI, Bailo allows the use of personal access tokens for fine-grained access. Tokens grant access to
+specific models and specific actions.
+
+### Creating a Token
-If you are not using PKI then Bailo allows the usage of access tokens to allow for fine-grained access. Tokens are used
-to grant access to models within Bailo to specific models and specific actions. These can be found in
-`Settings > Authentication`.
+1. Navigate to **User (top right) > Settings > Authentication**
+2. Click **Add token**
-To create a new access token, press `Add token` and select the options from below.
-
-- `image:read` pull Docker images from Bailo
-- `file:read` download files from Bailo
-
-Copy and paste the `Access Key` and `Secret Key` and store these safely.
+3. Configure the token:
+ - **Description** - a name to help you identify this token
+ - **Scope** - choose "All models" or select specific models
+ - **Permissions** - select the actions this token allows
+4. Click **Generate Token**
+5. **Copy both the Access Key and Secret Key immediately** - the secret key is only shown once
-### Using tokens with the Python client
+### Using Tokens with the Python Client
```python
from bailo import TokenAgent, Client
-token_agent = TokenAgent(ACCESS_KEY, SECRET_KEY)
+agent = TokenAgent(
+ access_key="your-access-key",
+ secret_key="your-secret-key",
+)
+
+client = Client("https://your-bailo-instance.com", agent=agent)
+```
+
+### Using Tokens with curl
+
+Tokens use HTTP Basic Authentication with the access key as the username and secret key as the password:
-Client("http://127.0.0.1:8080", agent=token_agent)
+```bash
+curl -u "your-access-key:your-secret-key" \
+ https://your-bailo-instance.com/api/v2/models/search
```
+## Security Best Practices
+
+- **Never commit tokens to source control** - use environment variables or secret managers
+- **Use the minimum required permissions** - only grant the actions your workflow needs
+- **Scope tokens to specific models** when possible, rather than "All models"
+- **Rotate tokens regularly** - delete old tokens and create new ones periodically
+- **Store secret keys securely** - they cannot be retrieved after creation
+
## Base Agent
The full Python docs for the `Agent` class and subsequent child-classes is available
[here](../../python/bailo.core.html#bailo.core.agent.Agent). It is possible to pass `kwargs` to the base `Agent` class
such as `verify`.
+## Troubleshooting
+
+| Issue | Solution |
+| -------------------- | ------------------------------------------------------------------------------------- |
+| `401 Unauthorized` | Check your credentials are correct and the token hasn't been deleted |
+| `403 Forbidden` | Your token may not have the right permissions or model scope |
+| Certificate errors | Verify your certificate paths and that the CA certificate matches your Bailo instance |
+| `Connection refused` | Check the Bailo URL is correct and the instance is running |
+
+## Related Pages
+
+- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Detailed token management
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using the Python client library
+- [API Reference Overview](/docs/api-reference/overview) - All available API endpoints
+
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
index e341f023c5..5ea8905ee6 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
@@ -6,13 +6,68 @@ import bailoSwaggerDocs from 'public/docs/bailo_swagger_docs.png'
# OpenAPI Documentation
-Bailo provides an OpenAPI specification for all Bailo endpoints viewable [here](/api/v2/docs/) on a running Bailo
-instance.
+Bailo provides a full OpenAPI specification for all API endpoints, viewable through an interactive Swagger UI.
+
+## Accessing the Documentation
+
+The interactive API documentation is available at [`/api/v2/docs/`](/api/v2/docs/) on any running Bailo instance.
-For guidance on using Swagger UI, see the [official documentation](https://swagger.io/tools/swagger-ui/).
+## Using Swagger UI
+
+The Swagger UI lets you browse, understand, and test API endpoints directly in your browser.
+
+### Browsing Endpoints
+
+Endpoints are grouped by category (Models, Releases, Files, Schemas, etc.). Click on a group to expand it and see all
+available endpoints. Each endpoint shows:
+
+- The HTTP method and path
+- A description of what it does
+- Required and optional parameters
+- Request body schema (for POST/PUT/PATCH)
+- Response schema and status codes
+
+### Making Test Requests
+
+You can test endpoints directly from the Swagger UI:
+
+1. Click on an endpoint to expand it
+2. Click **Try it out**
+3. Fill in the required parameters and request body
+4. Click **Execute**
+5. View the response below
+
+> **Note**: You must be authenticated to make requests. If you're logged into Bailo in the same browser, your session
+> credentials will be used automatically.
+
+## Downloading the OpenAPI Specification
+
+To download the raw OpenAPI specification (useful for code generation or importing into API tools):
+
+- Navigate to `/api/v2/specification` on your Bailo instance
+- The response is the full OpenAPI JSON specification
+
+You can use this specification with tools like:
+
+- [OpenAPI Generator](https://openapi-generator.tech/) to generate client libraries
+- [Postman](https://www.postman.com/) to import all endpoints as a collection
+- [Insomnia](https://insomnia.rest/) for API testing
+
+## Endpoint Summary
+
+For a complete list of all API endpoints organised by domain, see the
+[API Reference Overview](/docs/api-reference/overview).
+
+For guidance on Swagger UI itself, see the [official Swagger documentation](https://swagger.io/tools/swagger-ui/).
+
+## Related Pages
+
+- [API Reference Overview](/docs/api-reference/overview) - Structured list of all endpoints
+- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Python wrapper for the API
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
new file mode 100644
index 0000000000..cba7dab728
--- /dev/null
+++ b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
@@ -0,0 +1,118 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+import Image from 'next/legacy/image'
+import Box from '@mui/material/Box'
+
+import personalAccessTokens from 'public/docs/bailo_personal_access_tokens.png'
+import createPersonalAccessToken from 'public/docs/bailo_create_personal_access_token.png'
+
+# Personal Access Tokens
+
+Personal Access Tokens (PATs) allow you to authenticate with Bailo's API and container registry programmatically. Each
+token can be scoped to specific models and actions, giving you fine-grained control over what the token can do.
+
+## Creating a Token
+
+1. Navigate to **User (top right) > Settings > Authentication**
+2. Click **Add Token**
+
+
+
+
+
+3. Fill in the form:
+ - **Description** - a name to help you identify this token (e.g. "CI/CD pipeline", "Local development")
+ - **Models** - choose **All models** or select specific models
+ - **Actions** - select the permitted actions this token can perform
+
+
+
+
+
+4. Click **Generate Token**
+5. **Copy both the Access Key and Secret Key immediately** - the secret key is only shown once and cannot be retrieved
+ later
+
+## Available Permissions
+
+| Permission | Description |
+| ---------------------- | ----------------------------------------------- |
+| `model:read` | View model and data card settings |
+| `model:write` | Create and update model and data card settings |
+| `model:export` | Export model and data card settings |
+| `release:read` | View release information |
+| `release:write` | Create and update releases |
+| `release:export` | Export release information |
+| `access_request:read` | View and list access requests |
+| `access_request:write` | Create, approve, and comment on access requests |
+| `file:read` | Download and view files |
+| `file:write` | Upload and delete files |
+| `image:read` | List and pull container (Docker) images |
+| `image:write` | Push and delete container images |
+| `schema:write` | Upload and modify schemas (administrators only) |
+| `reviewRole:read` | View review roles |
+| `reviewRole:write` | Create and update review roles |
+
+> **Note**: Selecting a write permission automatically includes the corresponding read permission.
+
+## Token Scoping
+
+- **All models** - the token works with every model in Bailo
+- **Specific models** - the token only works with the models you select
+
+Use specific model scoping when possible to follow the principle of least privilege.
+
+## Managing Tokens
+
+To view or delete existing tokens:
+
+1. Navigate to **User > Settings > Authentication**
+2. Your existing tokens are listed with their description and access key
+3. Click the delete button next to a token to revoke it
+
+> **Important**: Deleting a token is immediate and permanent. Any scripts or applications using that token will stop
+> working.
+
+## Using Tokens
+
+Tokens use HTTP Basic Authentication:
+
+- **Username**: the access key
+- **Password**: the secret key
+
+### With the Python Client
+
+```python
+from bailo import TokenAgent, Client
+
+agent = TokenAgent(access_key="your-access-key", secret_key="your-secret-key")
+client = Client("https://your-bailo-instance.com", agent=agent)
+```
+
+### With curl
+
+```bash
+curl -u "your-access-key:your-secret-key" \
+ https://your-bailo-instance.com/api/v2/models/search
+```
+
+### With the Container Registry
+
+```bash
+docker login your-registry-host -u "your-access-key" -p "your-secret-key"
+```
+
+## Security Best Practices
+
+- **Store secret keys securely** - use environment variables or a secrets manager, not source code
+- **Use minimum permissions** - only grant the actions your workflow needs
+- **Scope to specific models** when possible
+- **Rotate tokens regularly** - delete old tokens and create new ones
+- **Use separate tokens** for different purposes (CI/CD, local dev, etc.)
+
+## Related Pages
+
+- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Overview of authentication methods
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using tokens with the Python client
+- [API Reference Overview](/docs/api-reference/overview) - All available API endpoints
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
index 4288fdecbd..afbf06ff6b 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
@@ -238,7 +238,8 @@ Refer to the [full API documentation](../../python/index.html) for detailed meth
## Related Pages
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Detailed authentication setup
-- [Personal Access Tokens](/docs/users/using-a-model/personal-access-tokens) - Creating tokens for API access
+- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Creating tokens for API
+ access
- [OpenAPI Reference](/docs/users/programmatically-using-bailo/open-api) - REST API documentation
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
index 8766a4962b..c1ef353ad2 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
@@ -2,27 +2,57 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Webhooks
-Bailo provides webhooks for programmatic, event-driven interactions with individual models for interfacing with external
-applications.
+Bailo provides webhooks for programmatic, event-driven interactions with individual models. When certain events occur on
+a model, Bailo sends an HTTP POST request to a URL you specify, allowing you to integrate with external applications and
+workflows.
+
+## Setting Up a Webhook
+
+Webhooks are managed through the API. To create a webhook for a model:
+
+```bash
+curl -X POST https://your-bailo-instance.com/api/v2/model/{modelId}/webhooks \
+ -H "Content-Type: application/json" \
+ -u "your-access-key:your-secret-key" \
+ -d '{
+ "name": "My CI/CD webhook",
+ "uri": "https://your-service.com/webhook",
+ "token": "your-bearer-token",
+ "events": ["createRelease", "updateRelease"],
+ "active": true,
+ "insecureSSL": false
+ }'
+```
-## Events
+### Webhook Configuration Options
-A Bailo model's webhook events are:
+| Field | Description | Required |
+| --------------- | ------------------------------------------------------------------------- | ---------------------- |
+| **name** | A descriptive name for the webhook | Yes |
+| **uri** | The URL that will receive the POST requests | Yes |
+| **token** | A bearer token included in the `Authorization` header of webhook requests | No |
+| **events** | Which events trigger this webhook (see below) | No (defaults to all) |
+| **active** | Whether the webhook is enabled | No (defaults to true) |
+| **insecureSSL** | Skip SSL verification for the target URL | No (defaults to false) |
-- `createRelease`
-- `updateRelease`
-- `createReviewResponse`
-- `createAccessRequest`
+## Events
-To view and configure webhooks for a given model, refer to the Webhook section of our [api docs](./open-api).
+A Bailo model's webhook can be triggered by the following events:
+
+| Event | When It Fires |
+| ---------------------- | ---------------------------------------------------------- |
+| `createRelease` | A new release is created on the model |
+| `updateRelease` | An existing release is updated |
+| `createReviewResponse` | A reviewer submits a response (approval or change request) |
+| `createAccessRequest` | A user submits an access request for the model |
## Request Format
-When a webhook is triggered, it will send a `POST` request to the webhook's URI.
+When a webhook is triggered, it sends a `POST` request to the webhook's URI.
-The webhook will include `"Authorization": "Bearer "` in the request `headers` if the webhook has a token.
+The webhook includes `"Authorization": "Bearer "` in the request `headers` if the webhook has a token configured.
-The body of the webhook's request will vary depending on the type of hook.
+The body of the webhook's request varies depending on the type of event.
### createRelease / updateRelease
@@ -60,7 +90,7 @@ The body of the webhook's request will vary depending on the type of hook.
"semver": "0.0.1",
"accessRequestId": "123456789abcdef012345678",
"modelId": "abc123",
- "kind": "{release|access}"
+ "kind": "{release|access}",
"role": "mtr",
"createdAt": "2025-01-21T12:00:00.000Z",
"updatedAt": "2025-01-21T12:00:00.000Z"
@@ -90,4 +120,46 @@ The body of the webhook's request will vary depending on the type of hook.
}
```
+## Managing Webhooks
+
+### Listing Webhooks
+
+```bash
+curl https://your-bailo-instance.com/api/v2/model/{modelId}/webhooks \
+ -u "your-access-key:your-secret-key"
+```
+
+### Updating a Webhook
+
+```bash
+curl -X PUT https://your-bailo-instance.com/api/v2/model/{modelId}/webhook/{webhookId} \
+ -H "Content-Type: application/json" \
+ -u "your-access-key:your-secret-key" \
+ -d '{
+ "name": "Updated webhook name",
+ "uri": "https://your-service.com/webhook",
+ "events": ["createRelease"],
+ "active": true
+ }'
+```
+
+### Deleting a Webhook
+
+```bash
+curl -X DELETE https://your-bailo-instance.com/api/v2/model/{modelId}/webhook/{webhookId} \
+ -u "your-access-key:your-secret-key"
+```
+
+## Security Considerations
+
+- **Use the token field** to include a bearer token in webhook requests, so your receiving service can verify the
+ request came from Bailo
+- **Use HTTPS** for your webhook URI to prevent eavesdropping on the request payloads
+- **Avoid `insecureSSL: true`** in production - only use it for testing with self-signed certificates
+
+## Related Pages
+
+- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
+- [API Reference Overview](/docs/api-reference/overview) - All available API endpoints
+
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/reviews/review-outcomes.mdx b/frontend/pages/docs/users/reviews/review-outcomes.mdx
new file mode 100644
index 0000000000..2a6a21ea27
--- /dev/null
+++ b/frontend/pages/docs/users/reviews/review-outcomes.mdx
@@ -0,0 +1,73 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Review Outcomes
+
+This page explains what happens after a release or access request has been reviewed, including the different outcomes
+and what to do when changes are requested.
+
+## Release Review Outcomes
+
+### Approved
+
+When all required review roles have approved a release, it is marked as approved and moves to the **Your archived
+reviews** tab on the Reviews page. Approved releases are considered final and ready for use.
+
+Both the **Model Technical Reviewer** and the **Model Senior Responsible Officer** (or equivalent review roles
+configured for the schema) must approve before a release is fully approved.
+
+### Changes Requested
+
+If any reviewer requests changes, the model owner is notified. The model owner should:
+
+1. Review the feedback provided in the reviewer's comments
+2. Make the necessary changes to the model card, files, or release notes
+3. The reviewer can then re-evaluate and approve
+
+### Who Can Create Releases?
+
+Only the **Owner** and **Contributors** of a model can create releases. See
+[Roles & Permissions](/docs/reference/roles-and-permissions) for details.
+
+## Access Request Review Outcomes
+
+### Approved
+
+When the required reviewer approves an access request, the requesting user gains permission to download files and pull
+container images from the model. Approved access requests move to the **Your archived reviews** tab.
+
+### Changes Requested
+
+If the reviewer requests changes, the requesting user is notified. They should review the feedback and update their
+access request accordingly.
+
+### Who Reviews Access Requests?
+
+Access requests are typically reviewed by the **Model Senior Responsible Officer** (or equivalent). The specific review
+role depends on your schema configuration.
+
+## Viewing Review History
+
+To see the history of reviews for a model:
+
+- **Releases**: Open the model page and navigate to the **Releases** tab. Each release shows its review status.
+- **Access requests**: Open the model page and navigate to the **Access Requests** tab.
+
+To see all your completed reviews:
+
+1. Click **Reviews** in the navigation bar
+2. Select the **Your archived reviews** tab
+
+## Python Client Examples
+
+Detailed Python examples for working with releases and access requests are available:
+
+- [Models and Releases demo](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html)
+- [Access Requests demo](/docs/python/notebooks/access_requests_demo/index.html)
+
+## Related Pages
+
+- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works
+- [Reviewing a Release](/docs/users/reviews/reviewing/releases) - Guide for reviewers
+- [Reviewing an Access Request](/docs/users/reviews/reviewing/access) - Reviewing access requests
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/reviews/reviewed/access-request.mdx b/frontend/pages/docs/users/reviews/reviewed/access-request.mdx
deleted file mode 100644
index f26106df43..0000000000
--- a/frontend/pages/docs/users/reviews/reviewed/access-request.mdx
+++ /dev/null
@@ -1,20 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Reviewed Access Requests
-
-## What is an access request?
-
-An access request grants permission to use a model hosted in Bailo.
-
-## Who reviews access requests?
-
-This can only be reviewed and approved by the **Model Senior Responsible officer**.
-
-## Approval process
-
-When an access request is created, the Model Senior Responsible Officer can either request changes or approve. Once
-approved, the access request will be moved to **Archived**.
-
-An example Python workflow is available [here](/docs/python/notebooks/access_requests_demo/index.html).
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/reviews/reviewed/releases.mdx b/frontend/pages/docs/users/reviews/reviewed/releases.mdx
deleted file mode 100644
index a537dcb52f..0000000000
--- a/frontend/pages/docs/users/reviews/reviewed/releases.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Reviewed Releases
-
-## What is a release?
-
-A release represents a specific version of a model. Multiple releases can exist for the same model, allowing changes
-without affecting earlier versions.
-
-## How are releases reviewed?
-
-Release reviewers are assigned by the model owner, typically including:
-
-- Model Technical Reviewer
-- Model Senior Responsible Officer
-
-See [Completing The Model](../../managing-models-and-releases/upload-to-bailo/completing-the-model) for details.
-
-## Who can create a release?
-
-Only the owner of the model can create releases.
-
-## Approval process
-
-When the Model Technical Reviewer and Model Senior Responsible Officer review a release, one or both will leave a
-request for changes and/or approve. When approved by both roles, the release will be moved to **Archived**.
-
-An example Python workflow is available [here](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html).
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/reviews/reviewing/access.mdx b/frontend/pages/docs/users/reviews/reviewing/access.mdx
index f55ea37005..f80e4891ec 100644
--- a/frontend/pages/docs/users/reviews/reviewing/access.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/access.mdx
@@ -5,11 +5,50 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Reviewing an Access Request
-Access requests appear in the **Access Request Reviews** tab on the **Review** page. The review process mirrors release
-reviews. Only the **Model Senior Responsible Officer** can approve access requests.
+When a user submits an access request for a model, it enters the review process. Access request reviews are typically
+handled by the **Model Senior Responsible Officer** (or equivalent review role configured for the schema).
+
+## Finding Access Requests to Review
+
+Navigate to the **Reviews** page from the navigation bar. Access requests awaiting your review appear in the **Your open
+reviews** tab.
+## Reviewing an Access Request
+
+1. Select the access request from your review queue
+2. Click **View access request** and examine the request details:
+ - **Who** is requesting access (the requesting user or group)
+ - **Why** they need access (the justification provided in the form)
+ - **What** permissions they are requesting
+ - **When** the access should expire (if an end date is specified)
+3. Add a **comment** explaining your decision
+4. Choose your decision:
+ - **Approve** - grant the requested access
+ - **Request changes** - ask the requester to provide more information or modify their request
+
+## After Approval
+
+Once an access request is approved:
+
+- The requesting user gains permission to **download files** and **pull container images** from the model
+- The access request moves to the **Your archived reviews** tab on the Reviews page
+- The requester is notified of the approval
+
+## After Requesting Changes
+
+If you request changes:
+
+- The requester is notified and can update their access request
+- Once updated, you can review the request again
+
+## Related Pages
+
+- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works end-to-end
+- [Review Outcomes](/docs/users/reviews/review-outcomes) - What happens after approval or change requests
+- [Requesting Access](/docs/users/using-a-model/requesting-access) - How users create access requests
+
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/reviews/reviewing/releases.mdx b/frontend/pages/docs/users/reviews/reviewing/releases.mdx
index 1fa345bd37..c2600c0471 100644
--- a/frontend/pages/docs/users/reviews/reviewing/releases.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/releases.mdx
@@ -7,25 +7,66 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Reviewing a Release
-When a release requires review, it appears to the relevant users & groups in the **Release Reviews** tab on the
-**Review** page.
+When a release is created on a model, it enters the review process. If you have been assigned a review role on that
+model, you will be notified and the release will appear in your review queue.
+
+## Who Sees Release Reviews?
+
+Release reviews are visible to users who have been assigned a **review role** on the model (e.g. Model Technical
+Reviewer, Model Senior Responsible Officer). The specific roles depend on the schema attached to the model.
+
+## Finding Releases to Review
+
+Navigate to the **Reviews** page from the navigation bar. Releases awaiting your review appear in the **Your open
+reviews** tab, under the **Releases** heading.
-Select the relevant release to open its details. A **Review** button appears in the release banner.
+## Reviewing a Release
+
+1. Either:
+ - Select a review from the **Reviews** page
+ - Navigate to the **Releases** page for the model. A **Review** button appears in the release banner
-You have the option of approving or requesting changes.
+2. Click **View full release** to examine the release:
+ - Review the **model card** for completeness and accuracy
+ - Check the **release notes** describe what is included
+ - Verify that appropriate **files** and **container images** are attached
+3. Add a **comment** explaining your decision (especially important if requesting changes)
+4. Choose your decision:
+ - **Approve** - you are satisfied with the release
+ - **Request changes** - something needs to be addressed
-When you have made your decision, an email will be sent to the model owner to notify them of your response.
+## After Submitting Your Review
+
+- An **email notification** is sent to the model owner with your decision
+- If you approved, the release moves closer to full approval (all required roles must approve)
+- If you requested changes, the model owner will update the release and you can review again
+- Your response is visible to other reviewers and the model owner
+
+## What to Look For
+
+Depending on your review role, consider checking:
+
+- **Technical reviewers**: Is the model architecture appropriate? Are evaluation metrics provided? Are known limitations
+ documented?
+- **Governance reviewers**: Are data handling practices documented? Are ethical considerations addressed? Does the model
+ meet organisational policies?
+
+## Related Pages
+
+- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works end-to-end
+- [Review Outcomes](/docs/users/reviews/review-outcomes) - What happens after approval or change requests
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - Understanding review roles
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/reviews/understanding-reviews.mdx b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
index 842ca4f116..204a5b24ab 100644
--- a/frontend/pages/docs/users/reviews/understanding-reviews.mdx
+++ b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
@@ -50,8 +50,8 @@ Review assignments are determined by three things:
To see reviews assigned to you:
1. Click **Review** in the navigation bar
-2. The **Open** tab shows reviews waiting for your action, with a count badge
-3. The **Archived** tab shows completed reviews
+2. The **Your open reviews** tab shows reviews waiting for your action, with a count badge
+3. The **Your archived reviews** tab shows completed reviews
## Responding to a Review
diff --git a/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx b/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
new file mode 100644
index 0000000000..6f4b8d2e71
--- /dev/null
+++ b/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
@@ -0,0 +1,54 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Untrusted Models
+
+Untrusted models are a special entry type for models that require additional scrutiny before being fully trusted within
+your organisation. This feature is optional and must be enabled by your administrator.
+
+## What are Untrusted Models?
+
+An untrusted model is a model that has not yet been verified or validated to the same standard as a regular model. Your
+organisation may use this classification for:
+
+- Models from external or unknown sources
+- Models that have not yet completed a full review cycle
+
+The specific meaning of "untrusted" depends on your organisation's policies. Your administrator configures a description
+that explains what untrusted models mean in your context.
+
+## Creating an Untrusted Model
+
+If untrusted models are enabled in your Bailo instance:
+
+1. Click the **+ Create** button in the navigation bar
+2. Under the **Models** section, select **Untrusted Model**
+3. Fill in the required fields:
+ - **Name**
+ - **Description**
+4. Click **Save**
+
+The creation process is the same as for a regular model, but the entry is classified as untrusted.
+
+## How Untrusted Models Differ
+
+Untrusted models appear in the Marketplace alongside regular models but are clearly marked as untrusted. Key differences
+include:
+
+- Untrusted Models are always Private
+- Access requests are not available for untrusted models
+- The container (Docker) registry is disabled for untrusted models
+- Users should exercise additional caution when using artefacts from untrusted models
+- Your organisation may have additional policies governing the use of untrusted models
+
+## Availability
+
+This feature is controlled by your administrator. If you don't see the **Untrusted Model** option when creating a new
+entry, it means the feature is not enabled in your Bailo instance.
+
+## Related Pages
+
+- [Creating a Model](/docs/users/models/creating-a-model) - Standard model creation
+- [Core Concepts](/docs/getting-started/core-concepts) - Overview of all entry types
+- [Glossary](/docs/reference/glossary) - Definition of untrusted models
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx b/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
new file mode 100644
index 0000000000..e801cf796e
--- /dev/null
+++ b/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
@@ -0,0 +1,76 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Browsing the Marketplace
+
+The Marketplace is the main page you see when you log into Bailo. It lists all public models and data cards, providing
+search and filtering tools to help you find what you need.
+
+## Searching
+
+Use the search bar at the top left of the Marketplace to find entries by name or description. You need to enter at least
+3 characters for search results to appear.
+
+By default, the search scans the entire document, including the model card data, to find exact matches to your query. To
+search only by title, toggle from **Full Text** to **Name** on the right side of the search bar. This performs a partial
+match search on titles only.
+
+Search results are limited to the currently selected tab (**Models** or **Data Cards**).
+
+## Filtering
+
+The Marketplace provides several ways to narrow down results:
+
+### By Entry Type
+
+Use the tabs to switch between:
+
+- **Models** - Machine learning models
+- **Data Cards** - Dataset documentation
+
+### By Organisation
+
+Organisations are displayed below the search bar. Filter models by the organisation they belong to.
+
+### By State
+
+Filter models by their development state (e.g. in development, ready for deployment).
+
+### By External Sources (Federation)
+
+If your Bailo instance is connected to other Bailo instances or external model repositories through federation, you can
+filter to see models from specific external sources. External sources only appear if federation is enabled by your
+administrator.
+
+### By Tags
+
+Click a tag to filter the list to models that have been assigned that tag. You can select multiple tags to narrow your
+results further.
+
+### By Mirrored Models
+
+Filter the list to show only mirrored models or data cards. Mirrored entries are replicas from external sources and are
+only available if mirroring has been enabled by your administrator.
+
+### By Roles
+
+Filter models based on your assigned role, showing only those where you hold a specific access role.
+
+## Visibility
+
+- **Public** models are visible to all users in the Marketplace
+- **Private** models do not appear in the Marketplace and are only visible to users who have been added as collaborators
+
+Even for public models, you typically need an approved access request to download files or pull container images.
+
+## Sharing Filtered Views
+
+Filter selections are stored in the page URL as query parameters. You can copy and share the URL to give someone the
+same filtered view of the Marketplace. **Role‑based filters are not included.**
+
+## Related Pages
+
+- [Requesting Access](/docs/users/using-a-model/requesting-access) - How to request access to a model
+- [Creating a Model](/docs/users/models/creating-a-model) - Adding your own model
+- [Core Concepts](/docs/getting-started/core-concepts) - Understanding entry types and visibility
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/using-a-model/personal-access-tokens.mdx b/frontend/pages/docs/users/using-a-model/personal-access-tokens.mdx
deleted file mode 100644
index 34108d2b88..0000000000
--- a/frontend/pages/docs/users/using-a-model/personal-access-tokens.mdx
+++ /dev/null
@@ -1,29 +0,0 @@
-import DocsWrapper from 'src/docs/DocsWrapper'
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-
-import personalAccessTokens from 'public/docs/bailo_personal_access_tokens.png'
-import createPersonalAccessToken from 'public/docs/bailo_create_personal_access_token.png'
-
-# Personal Access Tokens
-
-## What are Personal Access Tokens?
-
-Personal Access Tokens are used to authenticate users when interacting with the registry. When creating a token you will
-be asked to specify which models the token can be used with and which actions the token is able to authenticate.
-
-## Creating a Personal Access Token
-
-Open the **Personal Access Tokens** page and click **Add Token**.
-
-
-
-
-
-Complete the form and click **Generate Token**.
-
-
-
-
-
-export default ({ children }) => {children}
From b5ab4a432945287bf2a9812a4579e498b0c7d7ba Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 21 May 2026 07:29:54 +0000
Subject: [PATCH 05/23] Update some admin docs
---
.../federation/peer-integration.mdx | 73 +++++
.../deployment-architecture.mdx | 78 +++++
.../assigning-roles-to-schemas.mdx | 77 +++++
.../schemas/create-a-schema.mdx | 283 ++++++++++++------
frontend/pages/docs/directory.tsx | 10 +-
5 files changed, 422 insertions(+), 99 deletions(-)
create mode 100644 frontend/pages/docs/administration/federation/peer-integration.mdx
create mode 100644 frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
create mode 100644 frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
diff --git a/frontend/pages/docs/administration/federation/peer-integration.mdx b/frontend/pages/docs/administration/federation/peer-integration.mdx
new file mode 100644
index 0000000000..06c9175e43
--- /dev/null
+++ b/frontend/pages/docs/administration/federation/peer-integration.mdx
@@ -0,0 +1,73 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Federation and Peer Integration
+
+Federation connects your Bailo instance to other Bailo instances or external model repositories, allowing users to
+discover and mirror models from external sources.
+
+## Federation States
+
+Your Bailo instance can be in one of three federation states:
+
+| State | Description |
+| ------------- | --------------------------------------------------------------------------------------------------- |
+| **Disabled** | Federation is turned off. No external sources are visible. |
+| **Read Only** | Your instance can browse and mirror models from connected peers, but does not share its own models. |
+| **Enabled** | Full federation: your instance both reads from and shares models with connected peers. |
+
+The federation state is configured by your administrator in the application configuration.
+
+## Peer Types
+
+Bailo supports connecting to different types of external sources:
+
+| Peer Kind | Description |
+| ------------------- | -------------------------------- |
+| **Bailo** | Another Bailo instance |
+| **HuggingFace Hub** | The HuggingFace model repository |
+
+Additional sources can be set up by your Bailo administrator.
+
+## Configuring Peers
+
+Peers are configured in the application's backend configuration. Each peer requires:
+
+- **Base URL**: The URL of the external Bailo instance or repository
+- **Label**: A display name for the peer (shown in the Marketplace filter)
+- **Kind**: The type of peer (Bailo or HuggingFace Hub)
+- **State**: Whether federation with this peer is disabled, read-only, or enabled
+
+Peer configuration is done through the app configuration file - see
+[App Configuration](/docs/administration/getting-started/app-configuration).
+
+## How Federation Appears to Users
+
+When federation is enabled and peers are configured:
+
+- Users see a **filter by external sources** option in the Marketplace
+- Models from external sources appear alongside local models
+- Each external model shows its source
+- External models can be mirrored to create local read-only copies
+
+## Checking Peer Status
+
+You can check the status of connected peers:
+
+- **API**: `GET /api/v2/system/peers` returns the status of all configured peers
+- **System Status**: `GET /api/v2/system/status` includes the federation state
+
+Each peer has a reachability status indicating whether Bailo can communicate with it.
+
+## Model Mirroring via Federation
+
+When federation is enabled, users can create **Mirrored Models** from external sources. These are read-only copies that
+require periodic updates to stay in sync with the source. See
+[Creating a Mirrored Model](/docs/users/model-mirroring/creating-a-mirrored-model) for details.
+
+## Related Pages
+
+- [App Configuration](/docs/administration/getting-started/app-configuration) - Where peers are configured
+- [Creating a Mirrored Model](/docs/users/model-mirroring/creating-a-mirrored-model) - Mirroring external models
+- [Browsing the Marketplace](/docs/users/using-a-model/browsing-the-marketplace) - Filtering by external sources
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
new file mode 100644
index 0000000000..a794dc38f1
--- /dev/null
+++ b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
@@ -0,0 +1,78 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Deployment Architecture
+
+Bailo is composed of several services that work together. Understanding this architecture helps when configuring,
+deploying, and troubleshooting a Bailo instance.
+
+## Core Services
+
+| Service | Technology | Purpose |
+| ---------------------- | --------------------- | ---------------------------------------------------------------------- |
+| **Frontend** | Next.js (Node.js) | Serves the web application UI |
+| **Backend** | Node.js | API server handling all business logic and data access |
+| **NGINX** | NGINX | Reverse proxy routing requests to frontend, backend, and registry |
+| **MongoDB** | MongoDB | Stores all metadata: models, releases, schemas, reviews, users, tokens |
+| **Object Storage** | MinIO (S3-compatible) | Stores model files and registry blobs |
+| **Container Registry** | Docker Registry | Hosts container (Docker) images pushed to models |
+
+## Optional Services
+
+| Service | Technology | Purpose |
+| ---------------- | ---------------- | -------------------------------------------------------------- |
+| **ArtefactScan** | FastAPI (Python) | Security scanning microservice wrapping ModelScan and Trivy |
+| **ClamD** | ClamAV | Antivirus daemon used to scan uploaded files for malware |
+| **Mail Service** | SMTP-compatible | Sends email notifications for reviews and access requests |
+| **Webhook** | Webhook Tester | Development tool for receiving and inspecting webhook requests |
+
+## How Requests Flow
+
+1. Users access Bailo through the **NGINX** reverse proxy (default port 8080)
+2. NGINX routes requests:
+ - UI page requests go to the **Frontend**
+ - API requests (`/api/...`) go to the **Backend**
+ - Container registry requests (`/v2/...`) go to the **Container Registry**
+3. The **Backend** reads and writes metadata to **MongoDB**
+4. File uploads and downloads go through the **Backend** to **Object Storage** (MinIO)
+5. Container image push/pull operations go through the **Container Registry**, which also uses **Object Storage**
+6. When files or images are uploaded, the **Backend** triggers scans via the **ClamD** and **ArtefactScan** service (if
+ configured)
+
+## Deployment Options
+
+### Docker Compose (Development & Small Deployments)
+
+The repository includes a `compose.yaml` that runs the core services locally. This is the simplest way to get started.
+There is also ``compose.prod.yaml` to run all services locally. This is also used in the repository's GitHub workflows
+for testing.
+
+### Helm (Production & Kubernetes)
+
+For production deployments, Bailo provides Helm charts for deploying to Kubernetes. See:
+
+- [Helm Basic Usage](/docs/administration/helm/basic-usage)
+- [Helm Configuration](/docs/administration/helm/configuration)
+- [Isolated Environments](/docs/administration/helm/isolated-environments)
+
+## Data Storage
+
+Bailo stores data in two places:
+
+- **MongoDB** holds all structured metadata (models, schemas, reviews, tokens, etc.)
+- **Object Storage (MinIO/S3)** holds binary artefacts (model files, container image layers)
+
+Both need to be backed up to prevent data loss.
+
+## Configuration
+
+Bailo uses [node-config](https://github.com/node-config/node-config) for backend configuration. Configuration files can
+be overridden via environment variables or Helm values. See
+[App Configuration](/docs/administration/getting-started/app-configuration) for details.
+
+## Related Pages
+
+- [App Configuration](/docs/administration/getting-started/app-configuration) - Configuring the backend
+- [Helm Basic Usage](/docs/administration/helm/basic-usage) - Deploying with Helm
+- [Artefact Scanners](/docs/administration/microservices/artefact-scanners) - Configuring security scanning
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx b/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
new file mode 100644
index 0000000000..3c85b03bc2
--- /dev/null
+++ b/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
@@ -0,0 +1,77 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Assigning Review Roles to Schemas
+
+Review roles and schemas work together to define your governance process. When you attach review roles to a schema,
+every model that uses that schema will require those roles to approve releases and access requests.
+
+## How the Connection Works
+
+```
+Review Role ──attached to──> Schema ──selected by──> Model
+```
+
+1. An administrator creates review roles (e.g. "Model Technical Reviewer", "Model Senior Responsible Officer")
+2. Those roles are attached to a schema when the schema is created or edited
+3. When a model owner selects that schema, the model inherits the review role requirements
+4. The model owner then assigns specific people to each review role on their model
+
+## Attaching Roles During Schema Creation
+
+When creating a new schema:
+
+1. Navigate to **Schemas** from the navigation sidebar
+2. Click **Upload a new schema**
+3. Fill in the schema details (ID, name, description, type, uploaded JSON schema file)
+4. In the **Default Review Roles** section, select which roles this schema requires
+5. Upload the schema
+
+## Attaching Roles to an Existing Schema
+
+To modify which review roles are required by an existing schema:
+
+1. Navigate to **Schemas** from the navigation sidebar
+2. Select the schema you want to edit
+3. In the **Actions** menu, click **Update review roles**
+4. Make your selection
+5. **Save** your changes
+
+## What Happens When You Change Role Assignments
+
+When you add or remove a review role from a schema:
+
+- **Existing models** using that schema are affected - they will need the updated set of reviewers
+- **New models** created with the schema will inherit the current role requirements
+- Model owners may need to assign people to any newly added roles
+
+## Best Practices
+
+- **Plan role assignments before creating schemas** - It's easier to set up roles correctly from the start than to
+ change them later
+- **Use consistent roles across related schemas** - If you have multiple model card schemas, using the same review roles
+ makes the governance process predictable
+- **Document role expectations** - Use the review role description field to clearly explain what each reviewer should
+ check
+
+## Example Configuration
+
+A typical governance setup:
+
+1. Create two review roles:
+ - **Model Technical Reviewer (MTR)** - reviews technical quality
+ - **Model Senior Responsible Officer (MSRO)** - reviews governance and compliance
+2. Create a model card schema and attach both MTR and MSRO
+3. Create an access request schema and attach MSRO only
+
+This means:
+
+- Every release requires both technical and governance approval
+- Access requests only need governance approval
+
+## Related Pages
+
+- [Managing Review Roles](/docs/administration/review-roles/managing-review-roles) - Creating and editing roles
+- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - How schemas work
+- [Uploading a Schema](/docs/administration/schemas/upload-a-schema) - Uploading a schema to Bailo
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/administration/schemas/create-a-schema.mdx b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
index be2fc909f9..114edcabbd 100644
--- a/frontend/pages/docs/administration/schemas/create-a-schema.mdx
+++ b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
@@ -1,22 +1,91 @@
import DocsWrapper from 'src/docs/DocsWrapper'
-# Creating and Uploading schemas
+# Creating a Schema
-Bailo makes use of the [RJSF](https://react-jsonschema-form.readthedocs.io/en/latest/) (react-jsonschema-form) library
-in order to dynamically create its upload & access request forms. These forms are constructed using existing widgets, or
-custom widgets that have been created specifically for Bailo.
+Schemas define the structure of model card and access request forms in Bailo. They are built using
+[JSON Schema](https://json-schema.org/) and rendered using
+[RJSF](https://react-jsonschema-form.readthedocs.io/en/latest/) (React JSON Schema Form).
-## Example / minimal schemas
+If you're new to schemas, read [Understanding Schemas](/docs/administration/schemas/understanding-schemas) first for a
+non-technical overview.
-Bailo includes both an example schema for uploads and for deployments. You can find them in
-`backend/src/scripts/example_schemas`. It is important to note that these schemas contain all of mandatory fields that
-the application needs in order to run. These fields are hard-coded in various places in the source code.
+## Before You Start
-## Create a schema
+Bailo includes example schemas in `backend/src/scripts/example_schemas`. These contain all mandatory fields the
+application needs to run. Use them as a starting point for your own schemas.
-### Simple questions
+> **Important**: Some fields are required by the application and are referenced in the source code. Always start from an
+> example schema rather than building from scratch.
-A typical object inside the schema will look like this:
+## Schema Structure
+
+A schema is a JSON object with a `properties` field containing pages, sections, and questions.
+
+### Pages
+
+The top-level `properties` define the pages (tabs) of the form:
+
+```json
+{
+ "properties": {
+ "firstPage": {
+ "type": "object",
+ "title": "Page 1",
+ "properties": {
+ ...
+ }
+ },
+ "secondPage": {
+ "type": "object",
+ "title": "Page 2",
+ "properties": {
+ ...
+ }
+ }
+ }
+}
+```
+
+### Sections
+
+Within each page, you can create sub-sections using nested objects:
+
+```json
+{
+ "properties": {
+ "firstPage": {
+ "type": "object",
+ "title": "Page 1",
+ "properties": {
+ "sectionOne": {
+ "type": "object",
+ "title": "Section 1",
+ "properties": {
+ "questionOne": {
+ "type": "number",
+ "title": "Enter a number"
+ }
+ }
+ },
+ "sectionTwo": {
+ "type": "object",
+ "title": "Section 2",
+ "properties": {
+ "questionTwo": {
+ "type": "string",
+ "title": "Enter a string"
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+## Question Types
+
+### Simple Text Questions
```json
"firstName": {
@@ -27,14 +96,14 @@ A typical object inside the schema will look like this:
}
```
-The type property can be altered depending on what value you want the question to return. The title property will be
-displayed as the question itself, and the description will appear under the question to include any additional
-information that might help the user. Please note that if you do not include a title property, the library will use the
-name of the object (in this case firstName) instead.
+- **type** - the data type (`string`, `number`, `boolean`, `integer`)
+- **title** - the question text displayed to the user
+- **description** - help text shown below the question
+- **default** - a pre-filled value (optional)
-### Dates
+If you omit the `title` property, the library uses the property name (e.g. `firstName`).
-Dates can be added like this:
+### Dates
```json
"date": {
@@ -44,69 +113,29 @@ Dates can be added like this:
}
```
-### Sections
-
-When using Bailo you will see that the upload form is made up of a number of pages. Each page is a separate object
-inside the first "properties" property of the schema. For example:
+### Boolean Questions
```json
-"properties": {
- "firstPage": {
- "type": "object",
- "title": "Page 1",
- "properties": {
- ...
- }
- },
- "secondPage": {
- "type": "object",
- "title": "Page 2",
- "properties": {
- ...
- }
- }
+"isPublic": {
+ "type": "boolean",
+ "title": "Is this model publicly available?"
}
```
-Creating sub-sections works identically to how we defined our pages above. If we take the first page of our example
-above, and then amend it so it looks like this:
+### Dropdown Selections
```json
-"properties": {
- "firstPage": {
- "type": "object",
- "title": "Page 1",
- "properties": {
- "sectionOne": {
- "type": "object",
- "title": "Section 1"
- "properties": {
- "questionOne": {
- "type": "number",
- "title": "Enter a number",
- }
- }
- },
- "sectionTwo": {
- "type": "object",
- "title": "Section 2"
- "properties": {
- "questionTwo": {
- "type": "string",
- "title": "Enter a string",
- }
- }
- }
- },
- ...
- }
+"category": {
+ "type": "string",
+ "title": "Model category",
+ "enum": ["Classification", "Regression", "Generation", "Other"]
}
```
-#### Hiding sections from the model card
+## Hiding Sections from the Model Card
-Sections will display on the model card page by default, but in the case whereby a section needs to be hidden from the
-model card, then add the following property:
+By default, all sections are displayed on the model card page. To hide a section from the model card view while still
+collecting the data in the form:
```json
"myPage": {
@@ -115,20 +144,19 @@ model card, then add the following property:
"properties": {
...
},
- "displayModelCard": false,
+ "displayModelCard": false
}
```
-Note: This will only hide it from the model page, the data will still persist in the version metadata.
+> **Note**: This only hides the section from the model card display. The data still persists in the version metadata.
-### Dependencies
+## Dependencies (Conditional Questions)
-A dependency is useful when the answer to one question might warrant some additional information; for example, a boolean
-question might not need a detailed response if the answer is 'no', but if the user answer is 'yes' you might want to ask
-them for some additional details.
+Dependencies allow you to show or hide questions based on the answer to another question. For example, a boolean
+question might not need a detailed response if the answer is 'no', but if the user answers 'yes' you might want to ask
+for additional details.
-To avoid validation errors, Bailo schema dependencies need to be handled slightly differently to the ones provided in
-the RJSF documentation. Here is an example of how we handle dependencies for Bailo schemas:
+To avoid validation errors, Bailo schemas handle dependencies differently from the standard RJSF documentation:
```json
"myPage": {
@@ -137,11 +165,11 @@ the RJSF documentation. Here is an example of how we handle dependencies for Bai
"properties": {
"questionOne": {
"type": "boolean",
- "title": "True or false?",
+ "title": "True or false?"
},
"questionTwo": {
"title": "More information please!",
- "type": "string",
+ "type": "string"
}
},
"dependencies": {
@@ -180,21 +208,86 @@ the RJSF documentation. Here is an example of how we handle dependencies for Bai
}
```
-Inside `dependencies` we have defined a case of only having one of two different situations. Firstly, if `questionOne`
-is set to `false`, then `questionTwo` will be set to read only, whereas if we set `questionOne` to `true` then
-`questionTwo` will not be set as read only. This method might seem slightly more convoluted than the documentation
-online, but it allows for answers to be changed without making the schema invalid. The current design of RJSF's
-dependencies works as so:
-
-- User selects `true` for `questionOne`
-- User enters data into `questionTwo`
-- User changes their mind and selects `false` for `questionOne`
-- User data for `questionTwo` remains in the form data, despite not being visible on the form itself
-
-This behaviour is so that any user data is retained in case the user wishes to select `true` for `questionOne` again.
-From a user perspective this nice as it means there is less chance of data being lost when changing answers, but it does
-have a knock-on affect whereby in certain situations it will make the schema fail validation. Our approach is set the
-additional questions to read only when they are not in use. The downside to this approach is that we potentially include
-unwanted additional data, but this can be removed by the user if this happens.
+### Why This Pattern?
+
+The standard RJSF dependency approach can cause validation errors when users change their answers. The issue is:
+
+1. User selects `true` for `questionOne`
+2. User enters data into `questionTwo`
+3. User changes their mind and selects `false` for `questionOne`
+4. User data for `questionTwo` remains in the form data, despite not being visible
+
+Our approach sets additional questions to **read-only** instead of hiding them entirely. This preserves user data if
+they change their mind, while avoiding schema validation failures. The trade-off is that some unused data may persist,
+but it can be cleared by the user if needed.
+
+## Testing Your Schema
+
+Before deploying a schema to production:
+
+1. Create the schema as a JSON file following the structure above
+2. Upload it using the [Upload a Schema](/docs/administration/schemas/upload-a-schema) page
+3. Create a test model using the new schema
+4. Work through every page of the form to verify:
+ - All questions appear as expected
+ - Required fields are properly validated
+ - Dependencies show and hide correctly
+ - Section titles and descriptions are clear
+5. Check the model card view to confirm the right sections are displayed
+
+## Complete Example
+
+Here is a minimal but complete schema with two pages, a required field, and a dependency:
+
+```json
+{
+ "type": "object",
+ "properties": {
+ "overview": {
+ "type": "object",
+ "title": "Overview",
+ "properties": {
+ "modelName": {
+ "type": "string",
+ "title": "Model name"
+ },
+ "description": {
+ "type": "string",
+ "title": "Model description"
+ },
+ "tags": {
+ "type": "array",
+ "title": "Tags",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": ["modelName", "description"]
+ },
+ "details": {
+ "type": "object",
+ "title": "Technical Details",
+ "properties": {
+ "framework": {
+ "type": "string",
+ "title": "ML Framework",
+ "enum": ["PyTorch", "TensorFlow", "scikit-learn", "Other"]
+ },
+ "trainingData": {
+ "type": "string",
+ "title": "Training data description"
+ }
+ }
+ }
+ }
+}
+```
+
+## Related Pages
+
+- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - Non-technical overview
+- [Uploading a Schema](/docs/administration/schemas/upload-a-schema) - How to upload your schema to Bailo
+- [Schema Migrations](/docs/administration/schemas/schema-migrations) - Migrating data between schema versions
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/directory.tsx b/frontend/pages/docs/directory.tsx
index 8bd6878543..e490ad3835 100644
--- a/frontend/pages/docs/directory.tsx
+++ b/frontend/pages/docs/directory.tsx
@@ -79,6 +79,7 @@ export const flatDirectory: Array = [
/// Getting Started
{ title: 'Getting Started', slug: 'administration/getting-started', header: true },
+ { title: 'Deployment Architecture', slug: 'administration/getting-started/deployment-architecture' },
{ title: 'App Configuration', slug: 'administration/getting-started/app-configuration' },
/// Schema Management
@@ -91,6 +92,11 @@ export const flatDirectory: Array = [
/// Review Roles
{ title: 'Review Roles', slug: 'administration/review-roles', header: true },
{ title: 'Managing Review Roles', slug: 'administration/review-roles/managing-review-roles' },
+ { title: 'Assigning Roles to Schemas', slug: 'administration/review-roles/assigning-roles-to-schemas' },
+
+ /// Federation
+ { title: 'Federation', slug: 'administration/federation', header: true },
+ { title: 'Peer Integration', slug: 'administration/federation/peer-integration' },
/// Microservices
{ title: 'Microservices', slug: 'administration/microservices', header: true },
@@ -108,10 +114,6 @@ export const flatDirectory: Array = [
{ title: 'Bailo v2.0', slug: 'administration/migrations/bailo-2.0' },
{ title: 'DataBase Scripts', slug: 'administration/migrations/scripts' },
- // API Reference
- { title: 'API Reference', slug: 'api-reference', header: true },
- { title: 'Overview', slug: 'api-reference/overview' },
-
// Reference
{ title: 'Reference', slug: 'reference', header: true },
{ title: 'Glossary', slug: 'reference/glossary' },
From 7905fe2f3006fe18a90112a670a3c5c64db69511 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 21 May 2026 07:44:59 +0000
Subject: [PATCH 06/23] Replace models section of users
---
frontend/pages/docs/directory.tsx | 14 +--
.../upload-to-bailo/completing-the-model.mdx | 22 -----
.../upload-to-bailo/create-a-release.mdx | 24 -----
.../upload-to-bailo/creating-a-model.mdx | 63 -------------
.../docs/users/models/creating-a-model.mdx | 79 ++++++++++++++++
.../docs/users/models/creating-a-release.mdx | 94 +++++++++++++++++++
.../pages/docs/users/models/model-card.mdx | 77 +++++++++++++++
.../docs/users/models/model-templating.mdx | 65 +++++++++++++
.../files.mdx => models/uploading-files.mdx} | 16 ++--
.../uploading-images.mdx} | 19 ++--
10 files changed, 340 insertions(+), 133 deletions(-)
delete mode 100644 frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/completing-the-model.mdx
delete mode 100644 frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/create-a-release.mdx
delete mode 100644 frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/creating-a-model.mdx
create mode 100644 frontend/pages/docs/users/models/creating-a-model.mdx
create mode 100644 frontend/pages/docs/users/models/creating-a-release.mdx
create mode 100644 frontend/pages/docs/users/models/model-card.mdx
create mode 100644 frontend/pages/docs/users/models/model-templating.mdx
rename frontend/pages/docs/users/{managing-models-and-releases/upload-to-bailo/files.mdx => models/uploading-files.mdx} (87%)
rename frontend/pages/docs/users/{managing-models-and-releases/upload-to-bailo/images.mdx => models/uploading-images.mdx} (57%)
diff --git a/frontend/pages/docs/directory.tsx b/frontend/pages/docs/directory.tsx
index e490ad3835..3278476da6 100644
--- a/frontend/pages/docs/directory.tsx
+++ b/frontend/pages/docs/directory.tsx
@@ -26,13 +26,13 @@ export const flatDirectory: Array = [
// Users
{ title: 'Users', slug: 'users', header: true },
- { title: 'Managing Models and Releases', slug: 'users/managing-models-and-releases', header: true },
- { title: 'Uploading Artifacts', slug: 'users/managing-models-and-releases/upload-to-bailo', header: true },
- { title: 'Creating a Model', slug: 'users/managing-models-and-releases/upload-to-bailo/creating-a-model' },
- { title: 'Completing the Model', slug: 'users/managing-models-and-releases/upload-to-bailo/completing-the-model' },
- { title: 'Creating a Release', slug: 'users/managing-models-and-releases/upload-to-bailo/create-a-release' },
- { title: 'Uploading Files', slug: 'users/managing-models-and-releases/upload-to-bailo/files' },
- { title: 'Uploading Images', slug: 'users/managing-models-and-releases/upload-to-bailo/images' },
+ { title: 'Models', slug: 'users/models', header: true },
+ { title: 'Creating a Model', slug: 'users/models/creating-a-model' },
+ { title: 'Model Card', slug: 'users/models/model-card' },
+ { title: 'Creating a Release', slug: 'users/models/creating-a-release' },
+ { title: 'Uploading Files', slug: 'users/models/uploading-files' },
+ { title: 'Uploading Images', slug: 'users/models/uploading-images' },
+ { title: 'Model Templating', slug: 'users/models/model-templating' },
{ title: 'Data Cards', slug: 'users/data-cards', header: true },
{ title: 'Creating a Data Card', slug: 'users/data-cards/creating-a-data-card' },
diff --git a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/completing-the-model.mdx b/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/completing-the-model.mdx
deleted file mode 100644
index 0a370c283f..0000000000
--- a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/completing-the-model.mdx
+++ /dev/null
@@ -1,22 +0,0 @@
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-import bailoModelAccess from 'public/docs/bailo_model_access.png'
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Completing the Model
-
-Once your model has been uploaded and documented, it must be configured for review.
-
-1. Open the model and navigate to the **Settings** tab.
-2. Select **Model access** from the side menu.
-3. Use the **Add a user or group to the Model access list** dropdown to add any additional users and/or groups to the
- model access.
-4. Use the **Select roles** dropdown to choose the roles responsible for reviewing and approving the model.
-
-
-
-
-
-The selected roles will be notified when the model or its releases require review.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/create-a-release.mdx b/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/create-a-release.mdx
deleted file mode 100644
index 0bb817d226..0000000000
--- a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/create-a-release.mdx
+++ /dev/null
@@ -1,24 +0,0 @@
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-import bailoNewRelease from 'public/docs/bailo_new_release.png'
-import bailoNewReleaseForm from 'public/docs/bailo_new_release_form.png'
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Creating a release
-
-Once you have uploaded a model, go to the **_Releases_** tab, and click on **_Draft new Release_**.
-
-
-
-
-
-This will bring up a small form that will require you to choose a semver, add release notes and gives you the option of
-uploading files and images.
-
-
-
-
-
-Once the form is filled out, click on **_Create Release_** to submit all details.
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/creating-a-model.mdx b/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/creating-a-model.mdx
deleted file mode 100644
index 3c01fcd561..0000000000
--- a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/creating-a-model.mdx
+++ /dev/null
@@ -1,63 +0,0 @@
-import Image from 'next/legacy/image'
-import Box from '@mui/material/Box'
-import bailoMarketIcon from 'public/docs/bailo_market_icon.png'
-import DocsWrapper from 'src/docs/DocsWrapper'
-
-# Bailo Marketplace
-
-Models added to Bailo are displayed in the **Bailo Marketplace**, where they can be discovered and reused by other
-users.
-
-
-
-
-
-Models marked as **Private** are excluded from the Marketplace and are only visible to users who have been explicitly
-granted access.
-
-## Finding models
-
-Models can be discovered by:
-
-- Using the search bar
-- Filtering by tags
-
-## Adding a model to the Marketplace
-
-You can add a new model using either:
-
-- The **Create** button on the Marketplace page, or
-- The **Create** button in the application header
-
-Creating a model requires completing three fields:
-
-- **Model name**
-- **Model description**
-- **Visibility** (Public or Private)
-
-Public models are visible to all users. Private models are only visible to users with the appropriate permissions,
-configured in the model settings.
-
-Once these fields are completed, the model is created and added to Bailo.
-
-## Adding Model Card detail
-
-After creating the model, you must select a **schema**. The selected schema defines the structure of the model card.
-
-The model card captures important information such as:
-
-- Intended use
-- Training and evaluation details
-- Known limitations or biases
-
-Model card content can be updated over time as more information becomes available.
-
-## Changing the Model Name or Description
-
-To update the model name or description:
-
-1. Open the model
-2. Navigate to **Settings**
-3. Edit the **Name** and/or **Description** fields
-
-export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/models/creating-a-model.mdx b/frontend/pages/docs/users/models/creating-a-model.mdx
new file mode 100644
index 0000000000..b4f5935487
--- /dev/null
+++ b/frontend/pages/docs/users/models/creating-a-model.mdx
@@ -0,0 +1,79 @@
+import Image from 'next/legacy/image'
+import Box from '@mui/material/Box'
+import bailoMarketIcon from 'public/docs/bailo_market_icon.png'
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Creating a Model
+
+This guide walks you through creating a new model in Bailo, from the initial setup through to selecting a schema and
+filling in the model card.
+
+## Choosing an Entry Type
+
+Click the **+ Create** button in the navigation bar. You'll see the available entry types:
+
+| Type | Description |
+| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| **Model** | A standard machine learning model with full lifecycle management |
+| **Mirrored Model** | A read-only copy of a model from an external source (see [Model Mirroring](/docs/users/model-mirroring/creating-a-mirrored-model)) |
+| **Untrusted Model** | A model requiring additional scrutiny (if enabled - see [Untrusted Models](/docs/users/untrusted-models)) |
+| **Data Card** | Documentation for a dataset (see [Creating a Data Card](/docs/users/data-cards/creating-a-data-card)) |
+
+Select **Model** to create a standard model.
+
+## Basic Details
+
+Fill in the required fields:
+
+- **Name** - a clear, descriptive name for your model
+- **Description** - what the model does and its intended use
+- **Visibility** - choose **Public** (visible in the Marketplace) or **Private** (visible only to collaborators)
+
+Public models are visible to all users. Private models are only visible to users with the appropriate permissions,
+configured in the model settings.
+
+
+
+
+
+## Selecting a Schema
+
+After creating the model, you must select a **schema**. The schema defines the structure of your model card - the
+questions you'll answer about your model.
+
+You have two options:
+
+- **Create from schema** - select a schema from the available list and start with a blank form
+- **Create from template** - copy the model card structure and content from an existing model (see
+ [Model Templating](/docs/users/models/model-templating))
+
+The model card captures important information such as:
+
+- Intended use
+- Training and evaluation details
+- Performance metrics
+- Known limitations or biases
+
+## Next Steps
+
+After creating a model and selecting a schema:
+
+1. [Fill in the model card](/docs/users/models/model-card) - document your model
+2. [Upload files](/docs/users/models/uploading-files) - add model artefacts
+3. [Create a release](/docs/users/models/creating-a-release) - version your model for distribution
+
+## Changing the Model Name or Description
+
+To update the model name or description after creation:
+
+1. Open the model
+2. Navigate to **Settings**
+3. Edit the **Name** and/or **Description** fields
+
+## Related Pages
+
+- [Model Card](/docs/users/models/model-card) - Filling in the model card and configuring access
+- [Core Concepts](/docs/getting-started/core-concepts) - Understanding the Bailo data model
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Creating models programmatically
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/models/creating-a-release.mdx b/frontend/pages/docs/users/models/creating-a-release.mdx
new file mode 100644
index 0000000000..9c1530ef55
--- /dev/null
+++ b/frontend/pages/docs/users/models/creating-a-release.mdx
@@ -0,0 +1,94 @@
+import Image from 'next/legacy/image'
+import Box from '@mui/material/Box'
+import bailoNewRelease from 'public/docs/bailo_new_release.png'
+import bailoNewReleaseForm from 'public/docs/bailo_new_release_form.png'
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Creating a Release
+
+A release is a versioned snapshot of your model at a point in time. Releases bundle together files, container images,
+and a reference to a specific model card version. Creating a release triggers the review process.
+
+## What is a Release?
+
+Releases use [semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`, `2.0.0`):
+
+- **Major** version (first number): significant changes or breaking changes
+- **Minor** version (second number): new features or improvements
+- **Patch** version (third number): bug fixes or small updates
+
+## Creating a Release
+
+1. Open your model page and go to the **Releases** tab
+2. Click **Draft new Release**
+
+
+
+
+
+3. Fill in the release form:
+ - **Semver** - the version number for this release (e.g. `1.0.0`)
+ - **Release notes** - describe what is included in this release
+ - **Files** - attach uploaded files to this release
+ - **Images** - attach container (Docker) images to this release
+
+
+
+
+
+4. Click **Create Release** to submit
+
+## Draft vs Published Releases
+
+Releases are initially created as **drafts**. Draft releases can be edited before they are finalised. Once all required
+reviews are approved, the release is considered published.
+
+## Minor Releases
+
+You can mark a release as a **minor release** to bypass the review workflow. This is intended for small, low‑risk
+updates that do not materially change the behaviour or purpose of the model.
+
+Typical examples include:
+
+- Correcting documentation or release notes
+- Updating non-functional files (e.g. README updates)
+- Minor packaging or metadata adjustments
+- Replacing files with equivalent versions that do not change model behaviour
+
+Key points:
+
+- **No review is created** when a release is marked as minor
+- The release becomes available immediately after creation
+- The **minor flag cannot be changed** after the release is created
+- Minor releases should **not** be used for model updates, behavioural changes, or anything requiring governance review
+
+If a change could affect model performance, outputs, safety, or intended use, you should create a **standard release**
+so that it goes through the full review process.
+
+## What Happens After Creation
+
+Creating a release triggers the review process:
+
+1. All review roles assigned to the model are notified
+2. Each reviewer evaluates the release
+3. Once all required roles approve, the release is finalised
+4. If any reviewer requests changes, you'll be notified to update the release
+
+## Editing a Release
+
+To update a release after creation:
+
+1. Navigate to the **Releases** tab
+2. Select the release you want to edit
+3. Click **Edit release**
+4. Update the release notes, files, or images
+5. **Save** your changes
+
+## Related Pages
+
+- [Uploading Files](/docs/users/models/uploading-files) - Adding files to your model
+- [Uploading Images](/docs/users/models/uploading-images) - Pushing container images
+- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - The review process
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Creating releases programmatically
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/models/model-card.mdx b/frontend/pages/docs/users/models/model-card.mdx
new file mode 100644
index 0000000000..11215207a3
--- /dev/null
+++ b/frontend/pages/docs/users/models/model-card.mdx
@@ -0,0 +1,77 @@
+import Image from 'next/legacy/image'
+import Box from '@mui/material/Box'
+import bailoModelAccess from 'public/docs/bailo_model_access.png'
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Filling In the Model Card
+
+The model card is the structured documentation that describes your model. It captures information like intended use,
+training methodology, performance metrics, and known limitations. The questions you see come from the schema you
+selected when creating the model.
+
+## What is a Model Card?
+
+A model card serves as the authoritative documentation for a machine learning model. It helps:
+
+- **Reviewers** evaluate whether the model is fit for purpose
+- **Consumers** understand what the model does and its limitations
+- **Auditors** verify compliance with organisational policies
+
+## Filling In the Form
+
+The model card form is divided into sections (displayed as tabs). Work through each section, providing as much detail as
+you can.
+
+- **Required fields** are marked and must be completed
+- Your progress is saved only when you click **Save**
+- You can return and edit the model card at any time
+
+Each edit creates a **new version** of the model card. You can view previous versions in the model's version history.
+
+## Configuring Model Access
+
+Once your model card is filled in, configure who can access the model and who will review it.
+
+1. Open the model and navigate to the **Settings** tab
+2. Select **Access** from the side menu
+3. Use the **Add a user or group to the Model access list** dropdown to add collaborators
+4. Use the **Select roles** dropdown to choose the roles responsible for reviewing and approving the model
+5. **Save** your changes
+
+
+
+
+
+The selected roles will be notified when the model or its releases require review.
+
+### Entry Roles
+
+When adding collaborators, assign one of:
+
+| Role | Allows |
+| --------------- | ------------------------------------------------------------- |
+| **Owner** | Full control over the model |
+| **Contributor** | Edit model card, upload files, create releases |
+| **Consumer** | Download files and pull images (with approved access request) |
+
+### Review Roles
+
+Assign specific people to each review role required by the schema (e.g. Model Technical Reviewer, Model Senior
+Responsible Officer). These people will review releases and access requests.
+
+## Version History
+
+Every edit to the model card creates a new version. To view the history:
+
+1. Open the model page
+2. Navigate to the version history
+3. Select a previous version to see the model card at that point in time
+
+## Related Pages
+
+- [Creating a Model](/docs/users/models/creating-a-model) - Setting up a new model
+- [Creating a Release](/docs/users/models/creating-a-release) - Versioning your model
+- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - The review process
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - Detailed role reference
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/models/model-templating.mdx b/frontend/pages/docs/users/models/model-templating.mdx
new file mode 100644
index 0000000000..02138c1559
--- /dev/null
+++ b/frontend/pages/docs/users/models/model-templating.mdx
@@ -0,0 +1,65 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Creating a Model from a Template
+
+Model templating allows you to create a new model based on an existing model's structure and content. This is useful
+when you want to create models that share a similar model card layout or when your organisation has a standard model
+card format.
+
+## How Templating Works
+
+When you create a model from a template:
+
+1. A new model is created with your specified name and description
+2. The template model's model card structure and content are copied to the new model
+3. You can then edit the copied content to reflect your specific model's details
+
+The template model is not affected - it remains unchanged.
+
+## Prerequisites
+
+- The template model must have **Allow templating** enabled in its settings
+- You must have already created the new model (templating is applied to an existing model)
+
+## Using a Template
+
+1. Create a new model (see [Creating a Model](/docs/users/models/creating-a-model))
+2. When prompted to set up the model card, choose **Create from template**
+3. Select a template model from the dropdown (only models with templating enabled are shown)
+4. Click **Create from template**
+5. The model card content from the template is copied to your model
+6. Edit the content to reflect your specific model's details
+
+## Enabling Templating on a Model
+
+If you want other users to be able to use your model as a template:
+
+1. Open your model page
+2. Navigate to the **Settings** tab
+3. Enable **Allow templating**
+4. Save your changes
+
+Once enabled, your model will appear in the template selection dropdown for other users.
+
+## Programmatic Access
+
+You can also create a model from a template using the API or Python client:
+
+**API:**
+
+```
+POST /api/v2/model/{modelId}/setup/from-template
+```
+
+**Python client:**
+
+```python
+model.card_from_template(template_id="source-model-id")
+```
+
+## Related Pages
+
+- [Creating a Model](/docs/users/models/creating-a-model) - Standard model creation
+- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Programmatic workflows
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/files.mdx b/frontend/pages/docs/users/models/uploading-files.mdx
similarity index 87%
rename from frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/files.mdx
rename to frontend/pages/docs/users/models/uploading-files.mdx
index c4621a0696..25fd0fab65 100644
--- a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/files.mdx
+++ b/frontend/pages/docs/users/models/uploading-files.mdx
@@ -6,16 +6,16 @@ import bailoUploadFileRelease from 'public/docs/bailo_release_file_upload.png'
import bailoUploadedFileRelease from 'public/docs/bailo_created_release_upload_file.png'
import bailoUploadFile from 'public/docs/bailo_file_upload.png'
-# Uploading files
+# Uploading Files
Files represent any artefacts related to a model, such as binaries, configuration files, or supporting documentation.
These files allow others to build, evaluate, and use your model.
-## Adding files to a model
+## Adding Files to a Model
Files are uploaded from the **File Management** tab of a model.
-1. Click **Add New Files**
+1. Click **Add new files**
2. Select files to upload
3. Optionally assign tags to each file
@@ -23,17 +23,17 @@ Files are uploaded from the **File Management** tab of a model.
-## Adding files to a new release
+4. Click **Upload files**
-When creating a new release, you can attach both newly uploaded files and files that already exist on the model.
+## Adding Files to a New Release
-
+When creating a new release, you can attach both newly uploaded files and files that already exist on the model.
-## Adding files to an existing release
+## Adding Files to an Existing Release
Existing releases can be edited to add or remove files.
@@ -41,7 +41,7 @@ Existing releases can be edited to add or remove files.
-## Uploading files programmatically
+## Uploading Files Programmatically
To upload or download files programmatically, use the Bailo Python Client. Examples are available
[here](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html).
diff --git a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/images.mdx b/frontend/pages/docs/users/models/uploading-images.mdx
similarity index 57%
rename from frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/images.mdx
rename to frontend/pages/docs/users/models/uploading-images.mdx
index 58957a263d..f97b723bfd 100644
--- a/frontend/pages/docs/users/managing-models-and-releases/upload-to-bailo/images.mdx
+++ b/frontend/pages/docs/users/models/uploading-images.mdx
@@ -5,23 +5,24 @@ import Image from 'next/legacy/image'
import bailoPushImage from 'public/docs/bailo_push_image_to_docker_container.png'
import bailoImageRelease from 'public/docs/bailo_add_image_to_release.png'
-# Uploading docker images
+# Uploading Container Images
-Bailo uses a Docker registry to store container images associated with models. Unlike files, Docker images are
-**model‑specific**: you push an image to a model first, and then explicitly attach it to one or more releases.
+Bailo uses a container (Docker) registry to store container images associated with models. Unlike files, container
+images are **model-specific**: you push an image to a model first, and then explicitly attach it to one or more
+releases.
-## Pushing an image to a model
+## Pushing an Image to a Model
-To push a Docker image to Bailo, navigate to your model and open the **Registry** tab. This tab provides step‑by‑step
+To push a container image to Bailo, navigate to your model and open the **Registry** tab. This tab provides step-by-step
instructions tailored to your model and registry.
-## Adding an image to a release
+## Adding an Image to a Release
-Once the image has been successfully pushed to Bailo’s registry, it becomes available to attach to a release.
+Once the image has been successfully pushed to Bailo's registry, it becomes available to attach to a release.
Edit an existing release or create a new one, then select the image from the available list.
@@ -29,9 +30,9 @@ Edit an existing release or create a new one, then select the image from the ava
-## What is a Docker container?
+## What is a Container?
-In the context of Bailo, a Docker container is an isolated, self‑contained application environment used to run a model.
+In the context of Bailo, a container is an isolated, self-contained application environment used to run a model.
Packaging models as containers allows them to be started quickly, run consistently across environments, and used for
inference without additional setup.
From 7af9cb4f3bb5571a35ee779e716ab7470a215062 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 21 May 2026 08:16:07 +0000
Subject: [PATCH 07/23] Add inferencing docs and cleanup some links
---
.../federation/peer-integration.mdx | 5 +-
frontend/pages/docs/directory.tsx | 4 ++
.../creating-an-inference-service.mdx | 69 +++++++++++++++++++
.../managing-inference-services.mdx | 51 ++++++++++++++
.../authentication.mdx | 2 +-
.../programmatically-using-bailo/open-api.mdx | 5 +-
.../personal-access-tokens.mdx | 2 +-
.../programmatically-using-bailo/webhooks.mdx | 2 +-
8 files changed, 130 insertions(+), 10 deletions(-)
create mode 100644 frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
create mode 100644 frontend/pages/docs/users/inferencing/managing-inference-services.mdx
diff --git a/frontend/pages/docs/administration/federation/peer-integration.mdx b/frontend/pages/docs/administration/federation/peer-integration.mdx
index 06c9175e43..d6f1f8b736 100644
--- a/frontend/pages/docs/administration/federation/peer-integration.mdx
+++ b/frontend/pages/docs/administration/federation/peer-integration.mdx
@@ -51,10 +51,7 @@ When federation is enabled and peers are configured:
## Checking Peer Status
-You can check the status of connected peers:
-
-- **API**: `GET /api/v2/system/peers` returns the status of all configured peers
-- **System Status**: `GET /api/v2/system/status` includes the federation state
+You can check the status of connected peers [via the API](/api/v2/docs/#/system).
Each peer has a reachability status indicating whether Bailo can communicate with it.
diff --git a/frontend/pages/docs/directory.tsx b/frontend/pages/docs/directory.tsx
index 3278476da6..a6d3913422 100644
--- a/frontend/pages/docs/directory.tsx
+++ b/frontend/pages/docs/directory.tsx
@@ -55,6 +55,10 @@ export const flatDirectory: Array = [
{ title: 'File Scanning', slug: 'users/using-scanners/file-scanning' },
{ title: 'Image Scanning', slug: 'users/using-scanners/image-scanning' },
+ { title: 'Inferencing', slug: 'users/inferencing', header: true },
+ { title: 'Creating an Inference Service', slug: 'users/inferencing/creating-an-inference-service' },
+ { title: 'Managing Inference Services', slug: 'users/inferencing/managing-inference-services' },
+
{ title: 'Model Mirroring', slug: 'users/model-mirroring', header: true },
{ title: 'Creating a Mirrored Model', slug: 'users/model-mirroring/creating-a-mirrored-model' },
{ title: 'Editing a Mirrored Model Card', slug: 'users/model-mirroring/editing-a-mirrored-model-card' },
diff --git a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
new file mode 100644
index 0000000000..3e0a51f480
--- /dev/null
+++ b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
@@ -0,0 +1,69 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Creating an Inference Service
+
+An inference service deploys a model's container (Docker) image as a live endpoint, allowing you to make predictions
+without downloading the model locally. This feature must be enabled by your administrator.
+
+## Prerequisites
+
+Before creating an inference service, you need:
+
+- A container (Docker) image pushed to the model's registry (see
+ [Uploading Images](/docs/users/models/uploading-images))
+- Appropriate permissions on the model (Owner or Contributor)
+
+## Creating a Service
+
+1. Open your model page
+2. Navigate to the **Inferencing** tab
+3. Click **Create a new Inferencing Service**
+4. Fill in the form:
+
+| Field | Description | Required |
+| ------------------ | ------------------------------------------------------------ | --------- |
+| **Description** | What this inference service does | Yes |
+| **Image** | Select from the model's available container images | Yes |
+| **Port** | The port your model exposes for inference requests (1-65535) | Yes |
+| **Processor Type** | Choose CPU or an available GPU type | Yes |
+| **Memory** | Memory allocation in GB (1-8 GB, shown for CPU only) | Yes (CPU) |
+
+5. Click **Create Inferencing Service**
+
+### Choosing a Processor Type
+
+- **CPU**: Available on all deployments. You'll need to specify memory allocation (1-8 GB).
+- **GPU**: Available GPU types depend on your deployment's configuration. GPU options are configured by your
+ administrator.
+
+### Choosing a Port
+
+The port should match the port your model's container exposes for serving predictions. Common ports include:
+
+- `8080` or `8000` for HTTP-based inference servers
+- `5000` for Flask-based applications
+
+Check your model's container configuration if you're unsure which port to use.
+
+## After Creation
+
+Once created, the inference service will be provisioned. You can:
+
+- View the service status on the model's **Inferencing** tab
+- Access the service endpoint to make prediction requests
+- Generate a personal access token for authenticating inference requests
+
+## Authenticating Requests
+
+To make authenticated requests to an inference service, you'll need a personal access token. See
+[Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) for instructions on creating
+one.
+
+## Related Pages
+
+- [Managing Inference Services](/docs/users/inferencing/managing-inference-services) - Updating and deleting services
+- [Uploading Images](/docs/users/models/uploading-images) - How to push container images
+- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Authentication for
+ inference
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/inferencing/managing-inference-services.mdx b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
new file mode 100644
index 0000000000..14fe863694
--- /dev/null
+++ b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
@@ -0,0 +1,51 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Managing Inference Services
+
+Once an inference service has been created, you can view its details, update its configuration, or delete it.
+
+## Viewing Inference Services
+
+To see all inference services for a model:
+
+1. Open the model page
+2. Navigate to the **Inferencing** tab
+3. All active inference services are listed with their image, description, and status
+
+## Updating a Service
+
+To update an inference service's configuration:
+
+1. Navigate to the **Inferencing** tab on the model page
+2. Select the service you want to update
+3. Click **View Settings**
+4. Modify the fields as needed:
+ - **Description**
+ - **Port**
+ - **Processor Type**
+ - **Memory** (CPU only)
+5. Save your changes
+
+> **Note**: You cannot change the container image of an existing inference service. To use a different image, delete the
+> current service and create a new one.
+
+## Deleting a Service
+
+Deleting an inference service can only be done via the API:
+
+```
+DELETE /api/v2/model/{modelId}/inference/{image}/{tag}
+```
+
+Deleting a service stops it and removes the deployment. This action cannot be undone.
+
+## Programmatic Access
+
+You can also manage inference services [via the API](/api/v2/docs/#/inference).
+
+## Related Pages
+
+- [Creating an Inference Service](/docs/users/inferencing/creating-an-inference-service) - Setting up a new service
+- [OpenAPI Reference](/docs/users/programmatically-using-bailo/open-api) - Full API documentation
+
+export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
index 3c78a7f319..b6313987bc 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
@@ -127,6 +127,6 @@ such as `verify`.
- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Detailed token management
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using the Python client library
-- [API Reference Overview](/docs/api-reference/overview) - All available API endpoints
+- [Swagger API](/api/v2/docs) - All available API endpoints
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
index 5ea8905ee6..958154b0d5 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
@@ -59,14 +59,13 @@ You can use this specification with tools like:
## Endpoint Summary
-For a complete list of all API endpoints organised by domain, see the
-[API Reference Overview](/docs/api-reference/overview).
+For a complete list of all API endpoints organised by domain, see the [Swagger API](/api/v2/docs).
For guidance on Swagger UI itself, see the [official Swagger documentation](https://swagger.io/tools/swagger-ui/).
## Related Pages
-- [API Reference Overview](/docs/api-reference/overview) - Structured list of all endpoints
+- [Swagger API](/api/v2/docs) - All available API endpoints
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Python wrapper for the API
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
index cba7dab728..4ea0ee3e08 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
@@ -113,6 +113,6 @@ docker login your-registry-host -u "your-access-key" -p "your-secret-key"
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Overview of authentication methods
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using tokens with the Python client
-- [API Reference Overview](/docs/api-reference/overview) - All available API endpoints
+- [Swagger API](/api/v2/docs) - All available API endpoints
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
index c1ef353ad2..f2ef8fabab 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
@@ -160,6 +160,6 @@ curl -X DELETE https://your-bailo-instance.com/api/v2/model/{modelId}/webhook/{w
## Related Pages
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
-- [API Reference Overview](/docs/api-reference/overview) - All available API endpoints
+- [Swagger API](/api/v2/docs) - All available API endpoints
export default ({ children }) => {children}
From f4edb81bb4eb12b9ec2a23e1dce6b4b82a87d945 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 21 May 2026 10:32:53 +0000
Subject: [PATCH 08/23] RAG optimisation
---
.../federation/peer-integration.mdx | 30 ++++++----
.../getting-started/app-configuration.mdx | 6 ++
.../deployment-architecture.mdx | 42 ++++++++-----
.../docs/administration/helm/basic-usage.mdx | 8 +++
.../administration/helm/configuration.mdx | 6 ++
.../helm/isolated-environments.mdx | 31 ++++++----
.../microservices/artefact-scanners.mdx | 26 +++++---
.../administration/migrations/bailo-0.4.mdx | 37 ++++++++----
.../administration/migrations/bailo-2.0.mdx | 13 +++-
.../administration/migrations/scripts.mdx | 12 +++-
.../assigning-roles-to-schemas.mdx | 19 ++++--
.../review-roles/managing-review-roles.mdx | 33 +++++++----
.../schemas/create-a-schema.mdx | 15 ++++-
.../schemas/schema-migrations.mdx | 34 +++++++----
.../schemas/understanding-schemas.mdx | 32 ++++++----
.../schemas/upload-a-schema.mdx | 36 ++++++-----
.../docs/getting-started/core-concepts.mdx | 38 +++++++-----
.../docs/getting-started/quick-start.mdx | 35 +++++++----
frontend/pages/docs/index.mdx | 26 +++++---
frontend/pages/docs/reference/glossary.mdx | 10 +++-
.../docs/reference/roles-and-permissions.mdx | 59 +++++++++++--------
.../pages/docs/reference/troubleshooting.mdx | 23 ++++++++
22 files changed, 396 insertions(+), 175 deletions(-)
diff --git a/frontend/pages/docs/administration/federation/peer-integration.mdx b/frontend/pages/docs/administration/federation/peer-integration.mdx
index d6f1f8b736..1ea7205b75 100644
--- a/frontend/pages/docs/administration/federation/peer-integration.mdx
+++ b/frontend/pages/docs/administration/federation/peer-integration.mdx
@@ -2,29 +2,31 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Federation and Peer Integration
+> **Common questions this page answers:**
+>
+> - How do I connect Bailo to other instances?
+> - What is federation in Bailo?
+> - What federation states are available?
+
Federation connects your Bailo instance to other Bailo instances or external model repositories, allowing users to
discover and mirror models from external sources.
## Federation States
-Your Bailo instance can be in one of three federation states:
+Your Bailo instance can operate in one of three federation states, controlled by the administrator:
-| State | Description |
-| ------------- | --------------------------------------------------------------------------------------------------- |
-| **Disabled** | Federation is turned off. No external sources are visible. |
-| **Read Only** | Your instance can browse and mirror models from connected peers, but does not share its own models. |
-| **Enabled** | Full federation: your instance both reads from and shares models with connected peers. |
+- **Disabled** - Federation is turned off. No external sources are visible.
+- **Read Only** - Your instance can browse and mirror models from connected peers, but does not share its own models.
+- **Enabled** - Full federation: your instance both reads from and shares models with connected peers.
The federation state is configured by your administrator in the application configuration.
## Peer Types
-Bailo supports connecting to different types of external sources:
+Bailo supports connecting to different types of external model sources.
-| Peer Kind | Description |
-| ------------------- | -------------------------------- |
-| **Bailo** | Another Bailo instance |
-| **HuggingFace Hub** | The HuggingFace model repository |
+- **Bailo** - Another Bailo instance
+- **HuggingFace Hub** - The HuggingFace model repository
Additional sources can be set up by your Bailo administrator.
@@ -42,6 +44,8 @@ Peer configuration is done through the app configuration file - see
## How Federation Appears to Users
+Users see external models alongside local models in the Marketplace, with filtering by external source.
+
When federation is enabled and peers are configured:
- Users see a **filter by external sources** option in the Marketplace
@@ -51,12 +55,16 @@ When federation is enabled and peers are configured:
## Checking Peer Status
+Check the reachability of connected peers through the API.
+
You can check the status of connected peers [via the API](/api/v2/docs/#/system).
Each peer has a reachability status indicating whether Bailo can communicate with it.
## Model Mirroring via Federation
+Users can create read-only mirrored models from federated external sources.
+
When federation is enabled, users can create **Mirrored Models** from external sources. These are read-only copies that
require periodic updates to stay in sync with the source. See
[Creating a Mirrored Model](/docs/users/model-mirroring/creating-a-mirrored-model) for details.
diff --git a/frontend/pages/docs/administration/getting-started/app-configuration.mdx b/frontend/pages/docs/administration/getting-started/app-configuration.mdx
index 9dcefce47f..432ebf7768 100644
--- a/frontend/pages/docs/administration/getting-started/app-configuration.mdx
+++ b/frontend/pages/docs/administration/getting-started/app-configuration.mdx
@@ -2,6 +2,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# App Configuration
+> **Common questions this page answers:**
+>
+> - How do I configure Bailo?
+> - Where are the configuration files?
+> - How does configuration inheritance work?
+
## Configuration Files
> ⚠️ Note: If you use Helm this information does not apply to you. We use Helm to automatically configure the
diff --git a/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
index a794dc38f1..0a42cd3d93 100644
--- a/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
+++ b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
@@ -2,31 +2,41 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Deployment Architecture
+> **Common questions this page answers:**
+>
+> - What services make up Bailo?
+> - How does Bailo's architecture work?
+> - What are the deployment options?
+
Bailo is composed of several services that work together. Understanding this architecture helps when configuring,
deploying, and troubleshooting a Bailo instance.
## Core Services
-| Service | Technology | Purpose |
-| ---------------------- | --------------------- | ---------------------------------------------------------------------- |
-| **Frontend** | Next.js (Node.js) | Serves the web application UI |
-| **Backend** | Node.js | API server handling all business logic and data access |
-| **NGINX** | NGINX | Reverse proxy routing requests to frontend, backend, and registry |
-| **MongoDB** | MongoDB | Stores all metadata: models, releases, schemas, reviews, users, tokens |
-| **Object Storage** | MinIO (S3-compatible) | Stores model files and registry blobs |
-| **Container Registry** | Docker Registry | Hosts container (Docker) images pushed to models |
+Bailo requires six core services to operate.
+
+- **Frontend** (Next.js / Node.js) - Serves the web application UI
+- **Backend** (Node.js) - API (Application Programming Interface) server handling all business logic and data access
+- **NGINX** - Reverse proxy routing requests to frontend, backend, and registry
+- **MongoDB** - Stores all metadata: models, releases, schemas, reviews, users, tokens
+- **Object Storage** (MinIO, S3-compatible) - Stores model files and registry blobs. S3 stands for Simple Storage
+ Service.
+- **Container Registry** (Docker Registry) - Hosts container (Docker) images pushed to models
## Optional Services
-| Service | Technology | Purpose |
-| ---------------- | ---------------- | -------------------------------------------------------------- |
-| **ArtefactScan** | FastAPI (Python) | Security scanning microservice wrapping ModelScan and Trivy |
-| **ClamD** | ClamAV | Antivirus daemon used to scan uploaded files for malware |
-| **Mail Service** | SMTP-compatible | Sends email notifications for reviews and access requests |
-| **Webhook** | Webhook Tester | Development tool for receiving and inspecting webhook requests |
+These services add security scanning, email notifications, and webhook testing capabilities.
+
+- **ArtefactScan** (FastAPI / Python) - Security scanning microservice wrapping ModelScan and Trivy
+- **ClamD** (ClamAV) - Antivirus daemon used to scan uploaded files for malware
+- **Mail Service** (SMTP-compatible) - Sends email notifications for reviews and access requests. SMTP stands for Simple
+ Mail Transfer Protocol.
+- **Webhook** (Webhook Tester) - Development tool for receiving and inspecting webhook requests
## How Requests Flow
+All requests enter through the NGINX reverse proxy and are routed to the appropriate service.
+
1. Users access Bailo through the **NGINX** reverse proxy (default port 8080)
2. NGINX routes requests:
- UI page requests go to the **Frontend**
@@ -40,6 +50,8 @@ deploying, and troubleshooting a Bailo instance.
## Deployment Options
+Bailo can be deployed using Docker Compose for development or Helm for production Kubernetes environments.
+
### Docker Compose (Development & Small Deployments)
The repository includes a `compose.yaml` that runs the core services locally. This is the simplest way to get started.
@@ -56,7 +68,7 @@ For production deployments, Bailo provides Helm charts for deploying to Kubernet
## Data Storage
-Bailo stores data in two places:
+Bailo stores structured metadata in MongoDB and binary artefacts in S3-compatible object storage:
- **MongoDB** holds all structured metadata (models, schemas, reviews, tokens, etc.)
- **Object Storage (MinIO/S3)** holds binary artefacts (model files, container image layers)
diff --git a/frontend/pages/docs/administration/helm/basic-usage.mdx b/frontend/pages/docs/administration/helm/basic-usage.mdx
index ada52f9d50..574b63111c 100644
--- a/frontend/pages/docs/administration/helm/basic-usage.mdx
+++ b/frontend/pages/docs/administration/helm/basic-usage.mdx
@@ -8,6 +8,12 @@ same base templates for deploying Bailo, configuring overrides to values as need
For more details, see the [Helm project page](https://helm.sh/).
+> **Common questions this page answers:**
+>
+> - How do I deploy Bailo with Helm?
+> - What are the requirements for a Helm deployment?
+> - How do I upgrade or remove a Helm deployment?
+
## Requirements
- [HELM CLI](https://github.com/helm/helm/releases)
@@ -19,6 +25,8 @@ If you are deploying to OpenShift, you will also need OC:
## Deployment
+Deploy Bailo to Kubernetes or OpenShift using standard Helm commands.
+
### Setup
All commands assume they are run in the `infrastructure/helm/bailo` directory. You should have already authenticated
diff --git a/frontend/pages/docs/administration/helm/configuration.mdx b/frontend/pages/docs/administration/helm/configuration.mdx
index 5055126998..bdc24b7349 100644
--- a/frontend/pages/docs/administration/helm/configuration.mdx
+++ b/frontend/pages/docs/administration/helm/configuration.mdx
@@ -2,6 +2,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Helm Configuration
+> **Common questions this page answers:**
+>
+> - How do I configure Helm values for Bailo?
+> - How do I override the default Helm configuration?
+> - What minimum configuration is required?
+
The default Helm configuration is stored within `values.yaml`. You should not alter this configuration directly, instead
overriding individual values via the command line `--set` flag, or by providing a custom `--values` file.
diff --git a/frontend/pages/docs/administration/helm/isolated-environments.mdx b/frontend/pages/docs/administration/helm/isolated-environments.mdx
index e0cc517e97..c24f5159fe 100644
--- a/frontend/pages/docs/administration/helm/isolated-environments.mdx
+++ b/frontend/pages/docs/administration/helm/isolated-environments.mdx
@@ -5,23 +5,29 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Bailo is built to be deployed on isolated environments, where access to the internet is strictly regulated. To install
Bailo on a segregated environment you will need the following dependencies.
+> **Common questions this page answers:**
+>
+> - How do I deploy Bailo in an air-gapped environment?
+> - What dependencies does Bailo need for offline deployment?
+> - How do I configure the Trivy database in an isolated environment?
+
## Helm Charts
-We rely on the following [Bitnami charts](https://charts.bitnami.com/):
+Bailo's Helm chart depends on [Bitnami charts](https://charts.bitnami.com/):
- MinIO https://charts.bitnami.com/bitnami
- MongoDB https://charts.bitnami.com/bitnami
## Docker Images
-We rely on the following images:
+These container images must be available in your connected registry:
-- mongodb/mongodb-community-server:8.2.2-ubi9
-- bitnami/minio:2025.7.23
-- marlonb/mailcrab:v1.6.2
-- nginxinc/nginx-unprivileged:1.28.0-alpine3.21-slim
-- registry:3.0.0
-- node:24.11.1-alpine
+- mongodb/mongodb-community-server:8.x-ubi9
+- bitnamilegacy/minio:2025.x
+- marlonb/mailcrab:v1.x
+- nginxinc/nginx-unprivileged:1.x-alpine3.x-slim
+- registry:3.x
+- node:24.x-alpine
These are regularly updated. To retrieve the latest versions used, check `./compose.yaml` and `./backend/Dockerfile`.
These versions can be configured using the `tag` attribute for each image in `values.yaml` to override the defaults. In
@@ -29,8 +35,8 @@ general, keeping to the same major version will maintain compatibility with Bail
## NPM
-We rely on many NPM packages. The full list is available in `package-lock.json`, `frontend/package-lock.json` and
-`backend/package-lock.json`. Most are standard packages with the exception of:
+Bailo relies on many NPM (Node Package Manager) packages. The full list is available in `package-lock.json`,
+`frontend/package-lock.json` and `backend/package-lock.json`. Most are standard packages with the exception of:
- `sharp`, which is an optimised image transformer and requires some compilation tools.
- `cypress`, which is a user interface testing tool and requires a Chromium download.
@@ -41,6 +47,8 @@ Instructions on installing `cypress` without internet are available
## Trivy Database
+In isolated environments, Trivy may need custom configuration to access its vulnerability database.
+
To give greater visibility of Bailo's registry and it's containing images, some environments may use Trivy to scan for
threats, packages and more.
@@ -53,7 +61,8 @@ There are a number of environment variables that can be configured to customise
- `TRIVY_DB_HOSTNAME=ghcr.io` - Host to retrieve the database from
- `TRIVY_DB_IMAGE=ghcr.io/aquasecurity/trivy-db:2` - Image to retrieve the database from
-- `TRIVY_DB_TLS_VERIFY=True` - Enable or disable TLS verification or use a path to point to a custom certificate
+- `TRIVY_DB_TLS_VERIFY=True` - Enable or disable TLS (Transport Layer Security) verification or use a path to point to a
+ custom certificate
- `TRIVY_DB_INSECURE=False` - Enable if database host is not using TLS or has a custom certificate implementation
- `TRIVY_DB_USERNAME` - Registry login username
diff --git a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
index 0df72fa790..429c2d2d67 100644
--- a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
+++ b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
@@ -2,6 +2,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Artefact Scanners
+> **Common questions this page answers:**
+>
+> - What scanners does Bailo use?
+> - How do I configure artefact scanning?
+> - What is the ArtefactScan service?
+
Within Bailo, it is possible to optionally deploy artefact scanners which are designed to help manage any potential risk
of artefacts being uploaded with potentially malicious contents.
@@ -11,12 +17,12 @@ The scanners currently supported by Bailo are:
- [ArtefactScan](https://github.com/gchq/Bailo/tree/main/lib/artefactscan_api) - Bailo scanning service that
orchestrates multiple scanners
- [ModelScan](https://github.com/protectai/modelscan) - malicious or unsafe content detection in model artefacts
- - [Trivy](https://github.com/aquasecurity/trivy) - vulnerability scanning and SBOM generation for container image
- layers
+ - [Trivy](https://github.com/aquasecurity/trivy) - vulnerability scanning and SBOM (Software Bill of Materials)
+ generation for container image layers
## ClamAV
-ClamAV is used for traditional malware detection on uploaded files.
+ClamAV provides traditional antivirus malware detection for uploaded files.
- Uses the official [ClamAV Docker image](https://hub.docker.com/r/clamav/clamav)
- Integrated via a
@@ -66,12 +72,14 @@ Trivy is used to analyse container image layers for known vulnerabilities and to
## Minimal Configuration
-| Name | Description | Value |
-| ------------------------------------------------- | ----------------------------------------------------- | ------ |
-| `connectors.artefactScanners.kinds` | List of enabled artefact scanner kinds | `[]` |
-| `connectors.artefactScanners.retryDelayInMinutes` | Minutes between repeated scans of the same artefact | `60` |
-| `connectors.artefactScanners.maxInitRetries` | Number of startup connection attempts before failing | `5` |
-| `connectors.artefactScanners.initRetryDelay` | Delay between successive startup pings (milliseconds) | `5000` |
+Configure scanner settings in the backend application configuration.
+
+- **connectors.artefactScanners.kinds** - List of enabled artefact scanner kinds. Default: `[]`.
+- **connectors.artefactScanners.retryDelayInMinutes** - Minutes between repeated scans of the same artefact. Default:
+ `60`.
+- **connectors.artefactScanners.maxInitRetries** - Number of startup connection attempts before failing. Default: `5`.
+- **connectors.artefactScanners.initRetryDelay** - Delay between successive startup pings (milliseconds). Default:
+ `5000`.
Enabling or disabling specific scanners is handled via connector configuration and deployed microservices.
diff --git a/frontend/pages/docs/administration/migrations/bailo-0.4.mdx b/frontend/pages/docs/administration/migrations/bailo-0.4.mdx
index b46bfa4bf0..70a49829dc 100644
--- a/frontend/pages/docs/administration/migrations/bailo-0.4.mdx
+++ b/frontend/pages/docs/administration/migrations/bailo-0.4.mdx
@@ -1,6 +1,17 @@
import DocsWrapper from 'src/docs/DocsWrapper'
+import Alert from '@mui/material/Alert'
-## Bailo Migration to v0.4
+# Bailo Migration to v0.4
+
+
+ Bailo v0.4 is no longer supported. This page may include legacy and out-of-date information.
+
+
+> **Common questions this page answers:**
+>
+> - What changed in Bailo v0.4?
+> - How do I migrate to Bailo v0.4?
+> - What are the configuration changes in v0.4?
Whilst Bailo v0.4 does not introduce any database or major code changes, it does feature a reorganisation of the
project. Instead of the existing format where we had a single 'app', we now split it into two images:
@@ -8,15 +19,17 @@ project. Instead of the existing format where we had a single 'app', we now spli
- frontend
- backend
-The frontend section handles rendering the UI. When run in production, it is entirely statically built, simply sending
-raw HTML files to the user. The backend handles all API requests and provides the interactivity of the service.
+The frontend section handles rendering the UI (User Interface). When run in production, it is entirely statically built,
+simply sending raw HTML files to the user. The backend handles all API requests and provides the interactivity of the
+service.
The code originally in `server` is now stored in the `backend` folder.
### Turbo
-To handle multiple repositories, we now use the `turborepo` build system. It provides us with high performance and
-reproducible builds, only compiling what has changed since the last compilation. The monorepo is comprised of 'apps':
+Bailo v0.4 uses `turborepo` to manage the monorepo structure with separate frontend and backend apps. It provides us
+with high performance and reproducible builds, only compiling what has changed since the last compilation. The monorepo
+is comprised of 'apps':
- frontend
- backend
@@ -27,8 +40,8 @@ And libraries:
- lib/p-mongo-queue
- lib/node
-These are each individual npm packages, with their own `package.json` files, scripts and more. A script can be run in
-individual repositories by using `--workspace`, or in all by omitting it:
+These are each individual NPM (Node Package Manager) packages, with their own `package.json` files, scripts and more. A
+script can be run in individual repositories by using `--workspace`, or in all by omitting it:
```bash
# From the root directory
@@ -71,9 +84,9 @@ remain compatible with both old and new packages.
#### What is ESM?
-ESM, or ECMEAScript Modules, is the latest standard for packaging / modularising JS code, as opposed to CJS, or Common
-JavaScript. ESM has a number of benefits that include nicer import/export syntax, better code reusability, and also the
-ability to import modules asynchronously.
+ESM, or ECMAScript Modules, is the latest standard for packaging / modularising JS code, as opposed to CJS (CommonJS),
+or Common JavaScript. ESM has a number of benefits that include nicer import/export syntax, better code reusability, and
+also the ability to import modules asynchronously.
For more information about ESM, we recommend visiting:
@@ -82,6 +95,8 @@ For more information about ESM, we recommend visiting:
### Helm
+{/* Helm charts were updated to support the new two-container architecture. */}
+
To support running two containers, minor changes have been made to our `helm` charts. These changes add a new 'frontend'
container, which requires no environment variables / setup. All traffic should route to the frontend container EXCEPT:
@@ -96,6 +111,8 @@ methods.
### Config
+Configuration options were reorganised and standardised in v0.4.
+
We've taken the time to reduce the number of duplicate configuration options we have, and try to standardise the
existing values. If you are using a service such as helm, you may not need to make any changes.
diff --git a/frontend/pages/docs/administration/migrations/bailo-2.0.mdx b/frontend/pages/docs/administration/migrations/bailo-2.0.mdx
index 63d7c27eac..9d2a36658c 100644
--- a/frontend/pages/docs/administration/migrations/bailo-2.0.mdx
+++ b/frontend/pages/docs/administration/migrations/bailo-2.0.mdx
@@ -1,16 +1,25 @@
import DocsWrapper from 'src/docs/DocsWrapper'
-## Bailo Migration to v2.0
+# Bailo Migration to v2.0
+
+> **Common questions this page answers:**
+>
+> - What changed in Bailo v2.0?
+> - How do I migrate from Bailo v1 to v2?
+> - Can I run v1 and v2 simultaneously?
Bailo v2 is a complete rewrite of all aspects of the model management platform in order to meet modern demands. To try
to make the migration as easy as possible, Bailo can simultaneously run V1 and V2, allowing you to schedule the
migration over time.
+Bailo v2 is a complete rewrite that maintains the same architecture, allowing v1 and v2 to run simultaneously for
+gradual migration.
+
No architecture has significantly changed. We still require two application containers (frontend and backend), a
registry container and an nginx routing container. We also continue to store all data in:
- MongoDB for all metadata storage.
-- An S3 compatible platform for all binary storage.
+- An S3 (Simple Storage Service) compatible platform for all binary storage.
Whilst storage methods remain the same, all tables and keys are unique between V1 and V2 which allows for simultaneously
running multiple versions:
diff --git a/frontend/pages/docs/administration/migrations/scripts.mdx b/frontend/pages/docs/administration/migrations/scripts.mdx
index d0dd969abb..5e67b84ce4 100644
--- a/frontend/pages/docs/administration/migrations/scripts.mdx
+++ b/frontend/pages/docs/administration/migrations/scripts.mdx
@@ -1,6 +1,12 @@
import DocsWrapper from 'src/docs/DocsWrapper'
-## Bailo DataBase Migration Scripts
+# Database Migration Scripts
+
+> **Common questions this page answers:**
+>
+> - How do Bailo migration scripts work?
+> - How do I write a new migration script?
+> - What are common pitfalls when writing migrations?
As Bailo develops, the requirements for storing data also change. Sometimes this will simply be adding a new property or
Document to MongoDB, and other times it will require migrating a collection of properties to a new object and
@@ -47,7 +53,9 @@ data.
### Common gotchas
-- Using `{lean: true}` in a `find` query returns POJOs (not Mongoose Documents) as per
+These are common pitfalls to avoid when writing or updating migration scripts.
+
+- Using `{lean: true}` in a `find` query returns POJOs (Plain Old JavaScript Objects) (not Mongoose Documents) as per
[the docs](). The POJO does not have some
commonly needed such as `save`, not getters/setters which are commonly used in migration scripts when working with
properties that have been removed from a Document.
diff --git a/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx b/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
index 3c85b03bc2..02dafa2c6d 100644
--- a/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
+++ b/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
@@ -2,23 +2,32 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Assigning Review Roles to Schemas
+> **Common questions this page answers:**
+>
+> - How do I attach review roles to a schema?
+> - What happens when I change role assignments on a schema?
+> - How do review roles propagate from schemas to models?
+
Review roles and schemas work together to define your governance process. When you attach review roles to a schema,
every model that uses that schema will require those roles to approve releases and access requests.
## How the Connection Works
+Review roles are attached to schemas, and models inherit role requirements when they select a schema.
+
```
Review Role ──attached to──> Schema ──selected by──> Model
```
-1. An administrator creates review roles (e.g. "Model Technical Reviewer", "Model Senior Responsible Officer")
+1. An administrator creates review roles (e.g. "Model Technical Reviewer (MTR)", "Model Senior Responsible Officer
+ (MSRO)")
2. Those roles are attached to a schema when the schema is created or edited
3. When a model owner selects that schema, the model inherits the review role requirements
4. The model owner then assigns specific people to each review role on their model
## Attaching Roles During Schema Creation
-When creating a new schema:
+Select review roles during schema creation from the Default Review Roles section:
1. Navigate to **Schemas** from the navigation sidebar
2. Click **Upload a new schema**
@@ -28,7 +37,7 @@ When creating a new schema:
## Attaching Roles to an Existing Schema
-To modify which review roles are required by an existing schema:
+Modify review role requirements on existing schemas from the schema's Actions menu:
1. Navigate to **Schemas** from the navigation sidebar
2. Select the schema you want to edit
@@ -38,7 +47,7 @@ To modify which review roles are required by an existing schema:
## What Happens When You Change Role Assignments
-When you add or remove a review role from a schema:
+Changes to role assignments on a schema affect both existing and new models using that schema:
- **Existing models** using that schema are affected - they will need the updated set of reviewers
- **New models** created with the schema will inherit the current role requirements
@@ -46,6 +55,8 @@ When you add or remove a review role from a schema:
## Best Practices
+Plan role assignments before creating schemas and use consistent roles across related schemas.
+
- **Plan role assignments before creating schemas** - It's easier to set up roles correctly from the start than to
change them later
- **Use consistent roles across related schemas** - If you have multiple model card schemas, using the same review roles
diff --git a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
index 4d2c29862c..62a81b7685 100644
--- a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
+++ b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
@@ -2,6 +2,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Managing Review Roles
+> **Common questions this page answers:**
+>
+> - How do I create a review role in Bailo?
+> - What is a system role on a review role?
+> - How do I set up Model Technical Reviewer (MTR) and Model Senior Responsible Officer (MSRO)?
+
Review roles define who must approve releases and access requests for models in your organisation. As an administrator,
you can create, edit, and delete review roles to match your governance requirements.
@@ -9,6 +15,8 @@ Only administrators will have the following options available to them.
## Viewing Existing Roles
+View all configured review roles from the Review Roles navigation item.
+
To see all review roles configured in your Bailo instance, select **Review Roles** from the navigation sidebar.
This page lists all review roles with their name, short name, description, and associated system role.
@@ -19,16 +27,15 @@ To create a new review role:
1. Navigate to **Review Roles** from the navigation sidebar
2. Click **Create new review role**
-3. Fill in the following fields:
-
-| Field | Description | Example |
-| ------------------------- | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
-| **Name** | The display name for the role | Model Technical Reviewer |
-| **Short Name** | A brief identifier used internally | `mtr` |
-| **Description** | What this role is responsible for reviewing | Reviews the technical quality and fitness for purpose of models |
-| **System Role** | The minimum entry role a user must have to be assigned this review role. Options: Owner, Contributor, Consumer, or none | `Contributor` |
-| **Default collaborators** | Users or groups automatically assigned to this role when new models are created | `team-leads` |
-
+3. Populate the following fields:
+ - **Name** - The display name for the role. Example: "Model Technical Reviewer".
+ - **Short Name** - A brief identifier used internally. Example: "mtr".
+ - **Description** - What this role is responsible for reviewing. Example: "Reviews the technical quality and fitness
+ for purpose of models".
+ - **System Role** - The minimum entry role a user must have to be assigned this review role. Options: Owner,
+ Contributor, Consumer, or none. Example: "Contributor".
+ - **Default collaborators** - Users or groups automatically assigned to this role when new models are created.
+ Example: "team-leads".
4. Click **Submit**
### Choosing a System Role
@@ -58,7 +65,7 @@ Changes to review roles apply to all schemas that use the role and all models th
## Deleting a Review Role
-To delete a review role:
+Deleting a review role removes it from all schemas that reference it:
1. Navigate to **Review Roles**
2. Click on the role you want to delete
@@ -70,7 +77,7 @@ To delete a review role:
## Connecting Roles to Schemas
-After creating review roles, you need to attach them to schemas. This is done when creating or editing a schema:
+After creating review roles, attach them to schemas so that models using those schemas require the roles:
1. Navigate to **Schemas** from the navigation sidebar
2. Create or edit a schema
@@ -82,6 +89,8 @@ finalised.
## Common Configurations
+These examples show typical governance setups using review roles.
+
### Two-role governance (MTR + MSRO)
The most common setup uses two review roles:
diff --git a/frontend/pages/docs/administration/schemas/create-a-schema.mdx b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
index 114edcabbd..15cc337573 100644
--- a/frontend/pages/docs/administration/schemas/create-a-schema.mdx
+++ b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
@@ -4,11 +4,18 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Schemas define the structure of model card and access request forms in Bailo. They are built using
[JSON Schema](https://json-schema.org/) and rendered using
-[RJSF](https://react-jsonschema-form.readthedocs.io/en/latest/) (React JSON Schema Form).
+[RJSF (React JSON Schema Form)](https://react-jsonschema-form.readthedocs.io/en/latest/).
If you're new to schemas, read [Understanding Schemas](/docs/administration/schemas/understanding-schemas) first for a
non-technical overview.
+> **Common questions this page answers:**
+>
+> - How do I create a schema in Bailo?
+> - What question types are available in schemas?
+> - How do I add conditional fields to a schema?
+> - How do I test a schema?
+
## Before You Start
Bailo includes example schemas in `backend/src/scripts/example_schemas`. These contain all mandatory fields the
@@ -85,6 +92,8 @@ Within each page, you can create sub-sections using nested objects:
## Question Types
+Schemas support several question types including text, dates, booleans, and dropdowns.
+
### Simple Text Questions
```json
@@ -223,6 +232,8 @@ but it can be cleared by the user if needed.
## Testing Your Schema
+Always test a schema by uploading it, creating a test model, and working through every form page.
+
Before deploying a schema to production:
1. Create the schema as a JSON file following the structure above
@@ -237,7 +248,7 @@ Before deploying a schema to production:
## Complete Example
-Here is a minimal but complete schema with two pages, a required field, and a dependency:
+A minimal but complete schema with two pages, required fields, and basic structure:
```json
{
diff --git a/frontend/pages/docs/administration/schemas/schema-migrations.mdx b/frontend/pages/docs/administration/schemas/schema-migrations.mdx
index 4aca2e43e6..c2089c65f1 100644
--- a/frontend/pages/docs/administration/schemas/schema-migrations.mdx
+++ b/frontend/pages/docs/administration/schemas/schema-migrations.mdx
@@ -8,8 +8,16 @@ re-enter their information.
Only administrators will have the following options available to them.
+> **Common questions this page answers:**
+>
+> - How do I migrate models to a new schema version?
+> - What is a schema migration plan?
+> - What is the difference between draft and final migrations?
+
## When to Use Schema Migrations
+Use migrations when you've updated a schema and need to transform existing model card data to match.
+
Common scenarios:
- You've updated a schema to add new required fields
@@ -18,20 +26,18 @@ Common scenarios:
## How Migrations Work
-A schema migration is a **plan** that maps questions from a source schema to a target schema. For each question in the
-source, you specify one of two actions:
+A migration plan maps each question from a source schema to either a new location in the target schema or marks it for
+deletion. For each question in the source, you specify one of two actions:
-| Action | Description |
-| ---------- | ------------------------------------------------------------------------------------------ |
-| **Move** | The answer is copied from the source location to a specified location in the target schema |
-| **Delete** | The answer is discarded and not carried over to the target schema |
+- **Move** - The answer is copied from the source location to a specified location in the target schema
+- **Delete** - The answer is discarded and not carried over to the target schema
The migration plan preserves all existing data that you choose to move, while allowing you to restructure how it is
organised in the new schema.
## Comparing schemas
-Comparing schemas is a useful way to identify the differences between two schemas when planning a migration.
+Compare two schemas side by side to identify differences before planning a migration.
1. Navigate to **Schemas** from the navigation sidebar
2. Select **Compare**
@@ -41,20 +47,22 @@ Comparing schemas is a useful way to identify the differences between two schema
## Creating a Migration Plan
+Create a migration plan from the Schemas navigation item by mapping source questions to target locations.
+
1. Navigate to **Schemas** from the navigation sidebar
2. Select **Migrations**
3. Click **New schema migration plan**
4. Fill in the migration schemas:
- **Source Schema**: The schema you are migrating from
- **Target Schema**: The schema you are migrating to
-5. Click **Begin migration**
+5. Click **Begin migration** to proceed to the migration details screen.
6. Fill in the migration details:
- **Migration name**: A descriptive name for the migration (e.g. "v1 to v2 model card migration")
- **Migration description**: What this migration does and why
-7. For each question in the source schema, specify:
+7. With the migration details saved, you can now map each question. For each question in the source schema, specify:
- **Move**: Map it to a path in the target schema
- **Delete**: Mark it for removal
-8. Verify the intended actions under **View Actions**
+8. Once all questions have been mapped, verify the intended actions under **View Actions**.
9. Save as **Draft** (for testing) or **Final** (ready to use)
### Draft vs Final
@@ -66,7 +74,7 @@ It is recommended to save as a draft first, verify the mappings are correct, and
## Applying a Migration
-Once a migration plan is finalised, it can be applied to individual models:
+Once finalised, a migration plan can be applied to individual models that use the source schema:
- Models with the source schema will display "There is a migration available for this model." with a **Migrate** button
- Model owners may then **Select a Migration Plan**
@@ -78,6 +86,8 @@ Once a migration plan is finalised, it can be applied to individual models:
## Best Practices
+Test migrations as drafts, migrate incrementally, and communicate changes to model owners.
+
- **Test with a draft first**: Create the migration as a draft and review the mappings carefully before finalising
- **Migrate incrementally**: If you're making large changes, consider breaking them into smaller migration steps
- **Communicate with model owners**: Let them know a migration is happening and that they may need to fill in any new
@@ -86,7 +96,7 @@ Once a migration plan is finalised, it can be applied to individual models:
## Viewing Existing Migrations
-To see all migration plans:
+View all migration plans and their status from the Schemas navigation item:
1. Navigate to **Schemas** from the navigation sidebar
2. Select **Migrations**
diff --git a/frontend/pages/docs/administration/schemas/understanding-schemas.mdx b/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
index 77651724a7..d2629d8ba7 100644
--- a/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
+++ b/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
@@ -2,6 +2,13 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Understanding Schemas
+> **Common questions this page answers:**
+>
+> - What is a schema in Bailo?
+> - What types of schemas exist?
+> - Why do schemas matter?
+> - What is RJSF?
+
Schemas are the foundation of Bailo's governance model. They define the questions and structure of model cards and
access request forms, ensuring that every model in your organisation is documented consistently.
@@ -10,7 +17,8 @@ This page explains what schemas are and how they work. For step-by-step instruct
## What is a Schema?
-A schema is a template that defines:
+A schema is a template that defines the questions, structure, and validation rules for model card and access request
+forms:
- What **questions** appear when someone fills in a model card or access request form
- How those questions are **organised** into sections and tabs
@@ -22,16 +30,19 @@ fill in.
## Schema Types
-There are three types of schema:
+Bailo supports three types of schema, each serving a different purpose:
-| Type | Purpose |
-| ------------------ | --------------------------------------------------------------------------------------------------------------------------- |
-| **Model Card** | Defines the structure of model documentation - intended use, training details, performance metrics, limitations, etc. |
-| **Data Card** | Defines the fields for the information about the dataset - size, format, data source, known limitations or biases etc. |
-| **Access Request** | Defines the form users fill in when requesting access to a model - who is requesting, why, what permissions they need, etc. |
+- **Model Card** - Defines the structure of model documentation: intended use, training details, performance metrics,
+ limitations, etc.
+- **Data Card** - Defines the fields for dataset information: size, format, data source, known limitations or biases,
+ etc.
+- **Access Request** - Defines the form users fill in when requesting access to a model: who is requesting, why, what
+ permissions they need, etc.
## How Schemas Relate to Other Concepts
+Schemas connect to models, review roles, and forms in a structured relationship.
+
```
Schema ──defines──> Model Card Form
Schema ──defines──> Data Card Form
@@ -46,7 +57,7 @@ be assigned and to approve releases and access requests.
## Active vs Inactive Schemas
-Schemas can be **active** or **inactive**:
+Schemas can be toggled between active and inactive states without breaking existing models:
- **Active** schemas appear in the selection list when users create new models or access requests
- **Inactive** schemas are hidden from the selection list but continue to work for models that already use them
@@ -67,6 +78,8 @@ form to fill in.
## Schema Versioning and Migrations
+Schema migrations allow model card data to be transformed when schemas are updated.
+
As your organisation's requirements evolve, you may need to update schemas. Rather than forcing model owners to re-enter
all their information, Bailo supports **Schema Migrations** - plans that transform model card data from one schema
version to another.
@@ -75,8 +88,7 @@ See [Schema Migrations](/docs/administration/schemas/schema-migrations) for deta
## Technical Details
-Schemas are built using [JSON Schema](https://json-schema.org/) and rendered using
-[React JSON Schema Form (RJSF)](https://rjsf-team.github.io/react-jsonschema-form/). This means schemas support:
+Schemas are built using JSON Schema and rendered using RJSF (React JSON Schema Form). This means schemas support:
- Simple text fields, numbers, and dates
- Dropdown selections and radio buttons
diff --git a/frontend/pages/docs/administration/schemas/upload-a-schema.mdx b/frontend/pages/docs/administration/schemas/upload-a-schema.mdx
index 3fd35973d0..3ac01a44f5 100644
--- a/frontend/pages/docs/administration/schemas/upload-a-schema.mdx
+++ b/frontend/pages/docs/administration/schemas/upload-a-schema.mdx
@@ -4,31 +4,39 @@ import Box from '@mui/material/Box'
import bailoResetApprovals from '../../../../public/docs/bailo_upload_new_schema.png'
-## Upload a Schema
+# Upload a Schema
+
+> **Common questions this page answers:**
+>
+> - How do I upload a schema to Bailo?
+> - What fields are required when uploading a schema?
+> - How do I deactivate a schema?
+
+Upload new schemas from the schema management page. You must hold the admin role to manage schemas.
By default Bailo comes with a default schema for both a model card and an access request. These are added on startup in
`backend/src/services/v2/schema.ts`. These contain a small number of questions, and are not expected to be used on a
production system.
-To add a new schema, visit [/schemas/list](/schemas/list) on a running Bailo instance. To manage schemas you will need
-to hold the 'admin' role on the Bailo instance. Click the 'Upload a new Schema' button in the top left.
+1. To add a new schema, visit [/schemas/list](/schemas/list) on a running Bailo instance.
+2. Click the **Upload a new Schema** button in the top left.
-This will bring up a form to create a new schema. A description of each field is below:
+The screenshot above shows the Schemas page on the Model tab, with a populated schema called Minimal Schema v10
+displaying the Actions button to one side. An **Upload a new Schema** is prominently displayed at the top of the page.
-| Field | Description |
-| ----------- | -------------------------------------------------------------------------------------------------- |
-| Id | A globally unique schema identifier, should include the schema version. |
-| Name | A user facing name for the schema, should include the schema version. |
-| Description | This is displayed to the user to help them decide which schema to pick. This can include markdown. |
-| Schema Type | Either 'Model' or 'Access Request'. |
-| Schema | Select a 'JSON Schema' that includes the questions you require. |
+3. Populate the form to create a new schema with fields:
+ - **Id** - A globally unique schema identifier, should include the schema version.
+ - **Name** - A user-facing name for the schema, should include the schema version.
+ - **Description** - Displayed to the user to help them decide which schema to pick. Can include markdown.
+ - **Schema Type** - Either 'Model' or 'Access Request'.
+ - **Schema** - Select a JSON Schema that includes the questions you require.
-From the schema list page you can also convert a schema to inactive by pressing the 'make inactive' button. If a schema
-is deleted, any models associated with it will be deleted. Converting a schema to 'inactive' reduces it's priority
-within the UI but does not break any existing models uploaded with it.
+From the schema list page you can also convert a schema to inactive by pressing the **make inactive** button in the
+**Actions** menu. If a schema is deleted, any models associated with it will be deleted. Converting a schema to
+'inactive' reduces it's priority within the UI but does not break any existing models uploaded with it.
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/getting-started/core-concepts.mdx b/frontend/pages/docs/getting-started/core-concepts.mdx
index 57c15b0558..ea32baaf1e 100644
--- a/frontend/pages/docs/getting-started/core-concepts.mdx
+++ b/frontend/pages/docs/getting-started/core-concepts.mdx
@@ -5,22 +5,28 @@ import DocsWrapper from 'src/docs/DocsWrapper'
This page explains the key building blocks of Bailo and how they relate to each other. Understanding these concepts will
help you navigate the platform and make the most of its features.
+> **Common questions this page answers:**
+>
+> - What is a model card?
+> - What is the difference between a release and a model?
+> - What roles exist in Bailo?
+> - How does the review process work?
+
## Entry Types
-Everything in Bailo starts with an **Entry**. There are four types:
+Bailo organises content into four entry types, each serving a different purpose:
-| Entry Type | Description |
-| ------------------- | ----------------------------------------------------------------------------------------------------------- |
-| **Model** | A machine learning model with full lifecycle management - model card, releases, access control, and reviews |
-| **Data Card** | Documentation for a dataset, tracking its provenance, storage, and relationship to models |
-| **Mirrored Model** | A read-only copy of a model from another Bailo instance or external source |
-| **Untrusted Model** | A model flagged for additional scrutiny, with restricted capabilities |
+- **Model** - A machine learning model with full lifecycle management - model card, releases, access control, and
+ reviews
+- **Data Card** - Documentation for a dataset, tracking its provenance, storage, and relationship to models
+- **Mirrored Model** - A read-only copy of a model from another Bailo instance or external source
+- **Untrusted Model** - A model flagged for additional scrutiny, with restricted capabilities
Some Entry types must be enabled by your Bailo administrator before they can be used.
## The Lifecycle of a Model
-A model in Bailo follows a structured lifecycle:
+A model follows a structured lifecycle from creation through review to consumer access:
```
Create Model → Select Schema → Fill In Model Card → Add Collaborators
@@ -79,17 +85,15 @@ access request process.
## Roles and Permissions
-Bailo uses two systems of roles:
+Bailo uses two complementary role systems to control access and governance.
### Entry Roles
These are assigned per-model and control what actions a user can take:
-| Role | What It Allows |
-| --------------- | ---------------------------------------------------------------------------------------------------- |
-| **Owner** | Full control: edit model, manage collaborators, create releases, delete the model |
-| **Contributor** | Edit the model card, upload files and images, create releases |
-| **Consumer** | Download files and pull images (requires an approved access request, unless ungoverned access is on) |
+- **Owner** - Full control: edit model, manage collaborators, create releases, delete the model
+- **Contributor** - Edit the model card, upload files and images, create releases
+- **Consumer** - Download files and pull images (requires an approved access request, unless ungoverned access is on)
### Review Roles
@@ -103,7 +107,7 @@ For a full reference, see [Roles & Permissions](/docs/reference/roles-and-permis
## Visibility
-Models can be **Public** or **Private**:
+Model visibility controls who can discover and browse a model:
- **Public** models appear in the Marketplace and can be found by any user
- **Private** models are only visible to users who have been explicitly added as collaborators
@@ -112,7 +116,7 @@ Even for public models, downloading artefacts typically requires an approved acc
## Security Scanning
-Files and container images uploaded to Bailo are automatically scanned for security issues:
+Bailo automatically scans uploaded files and container images for security issues:
- **Files** are scanned by ClamAV (malware detection) and ModelScan (serialisation attack detection)
- **Container images** are scanned by Trivy (vulnerability detection with CVE reporting)
@@ -121,6 +125,8 @@ Scan results are displayed alongside each file and image, with severity ratings.
## Federation
+Federation allows multiple Bailo instances to share models across organisational boundaries.
+
Bailo instances can be connected through **Federation**, allowing models from one instance to appear in another. This is
useful for organisations with multiple deployments or for integrating with external model repositories like HuggingFace
Hub.
diff --git a/frontend/pages/docs/getting-started/quick-start.mdx b/frontend/pages/docs/getting-started/quick-start.mdx
index 23ebd48829..0812ec0dfc 100644
--- a/frontend/pages/docs/getting-started/quick-start.mdx
+++ b/frontend/pages/docs/getting-started/quick-start.mdx
@@ -5,10 +5,18 @@ import DocsWrapper from 'src/docs/DocsWrapper'
This guide walks you through the essential steps of using Bailo, from browsing models to creating your own. It should
take around 15 minutes to complete.
+> **Common questions this page answers:**
+>
+> - How do I create my first model in Bailo?
+> - How do I get started with Bailo?
+> - What is the basic workflow for publishing a model?
+
Before you begin, make sure you have access to your organisation's Bailo instance and can log in.
## Step 1: Browse the Marketplace
+The Marketplace is Bailo's home page where you can search and filter all public models and data cards.
+
When you first log in, you'll see the **Marketplace**. This is where all public models and data cards are listed. You
can:
@@ -21,15 +29,15 @@ or scroll through the list.
## Step 2: Create a Model
-To add a new model to Bailo:
+Register a new model entry in Bailo by providing its name, description, and visibility settings:
1. Click the **+ Create** button in the top navigation bar or in the Marketplace
2. Select **Model** as the entry type
-3. Fill in the required fields:
+3. Next, provide the basic information about your model by filling in the required fields:
- **Model Name**: A clear, descriptive name for your model
- **Description**: What the model does and its intended use
- **Access control**: Choose **Public** (visible to all users) or **Private** (visible only to collaborators)
-4. Click **Create Model**
+4. Once you have filled in these details:, click **Create Model**
Your model is now created and visible in the Marketplace (if public).
@@ -48,11 +56,11 @@ and how it should be used.
## Step 4: Add Collaborators and Reviewers
-Before creating a release, set up who can work with your model and who will review it:
+Control who can contribute to your model and who is responsible for reviewing releases:
1. Navigate to the **Settings** tab on your model page
2. Under **Access**, add users or groups as collaborators
-3. Assign roles:
+3. Assign the appropriate level of access to each collaborator via roles:
- **Owner**: Full control over the model
- **Contributor**: Can edit the model card and upload files
- **Consumer**: Can download files and images (after access approval)
@@ -61,7 +69,10 @@ Before creating a release, set up who can work with your model and who will revi
## Step 5: Upload Model Files
-You can upload model artefacts (weights, configurations, data files) at any time:
+Upload the actual model artefacts such as weights, configuration files, and training data so they can be attached to a
+release.
+
+You can upload model artefacts at any time:
1. Go to the **File management** tab
2. Click **Add new files** and select a file from your computer
@@ -72,12 +83,13 @@ If enabled, files are automatically scanned for security issues after upload.
## Step 6: Upload Container Images
-You can upload container images (e.g. Docker images) to the Bailo registry at any time:
+If your model includes a containerised application (e.g. a Docker image for inference), you can push it to the Bailo
+registry so it can be included in releases::
1. Go to the **Registry** tab on your model page
2. Click **Push image**
3. If you do not already have a user authentication token, click **Manage user tokens** and create one
-4. Log in to the registry using Docker:
+4. Authenticate your local Docker client using:
- Use your access key as the username
- Use your user token as the password
5. Tag your local image using the command shown in the dialog:
@@ -91,14 +103,15 @@ If enabled, images are automatically scanned for vulnerabilities after upload.
## Step 7: Create a Release
-A release is a versioned snapshot of your model, including its files and documentation.
+A release bundles a specific version of your model card together with its uploaded files and images, and triggers the
+review workflow:
1. Go to the **Releases** tab on your model page
2. Click **Draft new release**
-3. Fill in:
+3. Describe this version of the model:
- **Version**: Use semantic versioning (e.g. `1.0.0`)
- **Release notes**: Describe what's included in this release
-4. Attach any files and/or container images you've uploaded
+4. Include the artefacts you uploaded earlier e.g. any files and/or container images you've uploaded
5. Click **Create Release**
Creating a release triggers the review process. Your assigned reviewers will be notified.
diff --git a/frontend/pages/docs/index.mdx b/frontend/pages/docs/index.mdx
index 4a0689dd8e..fca0869807 100644
--- a/frontend/pages/docs/index.mdx
+++ b/frontend/pages/docs/index.mdx
@@ -2,6 +2,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# What is Bailo?
+> **Common questions this page answers:**
+>
+> - What does Bailo do and why would I use it?
+> - Where should I start as a new user, model consumer, or administrator?
+> - How is the documentation organised?
+
Bailo provides a **consistent**, **managed** platform for the machine learning lifecycle, enabling models to be deployed
in a **standardised** and **well orchestrated** way. This improves the use of ML models in operational contexts, and
does so in a **well controlled** and **low-risk** manner.
@@ -16,16 +22,22 @@ The service aims to:
## Where to Start
-| If you are... | Start here |
-| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
-| **New to Bailo** | [Quick Start Guide](/docs/getting-started/quick-start) - Create your first model in ~15 minutes |
-| **Looking to understand how Bailo works** | [Core Concepts](/docs/getting-started/core-concepts) - The data model, roles, and workflows |
-| **A model consumer** | [Requesting Access](/docs/users/using-a-model/requesting-access) - How to get access to a model |
-| **Using the API or Python client** | [Programmatic Access](/docs/users/programmatically-using-bailo/authentication) - Authentication and client libraries |
-| **An administrator** | [App Configuration](/docs/administration/getting-started/app-configuration) - Setting up and configuring Bailo |
+Pick the entry point that best matches your role or goal.
+
+- **New to Bailo**: [Quick Start Guide](/docs/getting-started/quick-start) - Create your first model in ~15 minutes
+- **Looking to understand how Bailo works**: [Core Concepts](/docs/getting-started/core-concepts) - The data model,
+ roles, and workflows
+- **A model consumer**: [Requesting Access](/docs/users/using-a-model/requesting-access) - How to get access to a model
+- **Using the API or Python client**: [Programmatic Access](/docs/users/programmatically-using-bailo/authentication) -
+ Authentication and client libraries
+- **An administrator**: [App Configuration](/docs/administration/getting-started/app-configuration) - Setting up and
+ configuring Bailo
## Documentation Sections
+The documentation is split into four sections covering onboarding, day-to-day usage, platform administration, and
+reference material.
+
- **Getting Started** - Quick start guide and core concepts for new users
- **Users** - Guides for creating models, managing releases, requesting access, reviews, and more
- **Administration** - Deployment, configuration, schema management, and review role setup
diff --git a/frontend/pages/docs/reference/glossary.mdx b/frontend/pages/docs/reference/glossary.mdx
index ccf03859ce..04e6f354be 100644
--- a/frontend/pages/docs/reference/glossary.mdx
+++ b/frontend/pages/docs/reference/glossary.mdx
@@ -2,7 +2,15 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Glossary
-Definitions of key terms used throughout Bailo.
+This page defines key terms used throughout Bailo's documentation and interface. Terms are listed alphabetically.
+
+> **Common questions this page answers:**
+>
+> - What does MTR mean in Bailo?
+> - What is a model card?
+> - What is an access request?
+> - What is the difference between an Owner, Contributor, and Consumer?
+> - What is RJSF?
---
diff --git a/frontend/pages/docs/reference/roles-and-permissions.mdx b/frontend/pages/docs/reference/roles-and-permissions.mdx
index acf48a9dec..c32653ecb2 100644
--- a/frontend/pages/docs/reference/roles-and-permissions.mdx
+++ b/frontend/pages/docs/reference/roles-and-permissions.mdx
@@ -5,10 +5,17 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Bailo uses two complementary role systems: **Entry Roles** that control what actions a user can take on a model, and
**Review Roles** that determine who must approve releases and access requests.
+> **Common questions this page answers:**
+>
+> - What can an Owner do in Bailo?
+> - What is the difference between entry roles and review roles?
+> - Who can delete a model?
+> - Who can upload files?
+> - What is a Model Technical Reviewer (MTR)?
+
## Entry Roles
-Every collaborator on a model is assigned one of three entry roles. These roles govern day-to-day interactions with the
-model.
+Every collaborator on a model is assigned one of three entry roles that govern day-to-day interactions.
### Owner
@@ -63,22 +70,24 @@ Consumers cannot:
## Permission Summary
-| Action | Owner | Contributor | Consumer | Public (no role) |
-| ---------------------- | ----- | ----------- | ------------------- | ---------------------- |
-| View public model | Yes | Yes | Yes | Yes |
-| View private model | Yes | Yes | Yes | No |
-| Edit model card | Yes | Yes | No | No |
-| Edit model settings | Yes | No | No | No |
-| Manage collaborators | Yes | No | No | No |
-| Upload files | Yes | Yes | No | No |
-| Delete files | Yes | Yes | No | No |
-| Push container images | Yes | Yes | No | No |
-| Create releases | Yes | Yes | No | No |
-| Delete releases | Yes | No | No | No |
-| Download files | Yes | Yes | With access request | With ungoverned access |
-| Pull container images | Yes | Yes | With access request | With ungoverned access |
-| Create access requests | Yes | Yes | Yes | No |
-| Delete model | Yes | No | No | No |
+This reference lists every action in Bailo and which roles can perform it.
+
+- **View public model** - Owner: Yes, Contributor: Yes, Consumer: Yes, Public (no role): Yes
+- **View private model** - Owner: Yes, Contributor: Yes, Consumer: Yes, Public (no role): No
+- **Edit model card** - Owner: Yes, Contributor: Yes, Consumer: No, Public (no role): No
+- **Edit model settings** - Owner: Yes, Contributor: No, Consumer: No, Public (no role): No
+- **Manage collaborators** - Owner: Yes, Contributor: No, Consumer: No, Public (no role): No
+- **Upload files** - Owner: Yes, Contributor: Yes, Consumer: No, Public (no role): No
+- **Delete files** - Owner: Yes, Contributor: Yes, Consumer: No, Public (no role): No
+- **Push container images** - Owner: Yes, Contributor: Yes, Consumer: No, Public (no role): No
+- **Create releases** - Owner: Yes, Contributor: Yes, Consumer: No, Public (no role): No
+- **Delete releases** - Owner: Yes, Contributor: No, Consumer: No, Public (no role): No
+- **Download files** - Owner: Yes, Contributor: Yes, Consumer: With access request, Public (no role): With ungoverned
+ access
+- **Pull container images** - Owner: Yes, Contributor: Yes, Consumer: With access request, Public (no role): With
+ ungoverned access
+- **Create access requests** - Owner: Yes, Contributor: Yes, Consumer: Yes, Public (no role): No
+- **Delete model** - Owner: Yes, Contributor: No, Consumer: No, Public (no role): No
## Review Roles
@@ -106,13 +115,11 @@ While organisations can create any review roles they need, two are commonly used
Each review role has:
-| Property | Description |
-| -------------------- | --------------------------------------------------------------------- |
-| **Name** | Display name (e.g. "Model Technical Reviewer") |
-| **Short Name** | Abbreviated identifier (e.g. "mtr") |
-| **Description** | Explanation of the role's purpose |
-| **System Role** | The minimum entry role needed (owner, contributor, consumer, or none) |
-| **Default Entities** | Users or groups automatically assigned to this role on new models |
+- **Name** - Display name (e.g. "Model Technical Reviewer")
+- **Short Name** - Abbreviated identifier (e.g. "mtr")
+- **Description** - Explanation of the role's purpose
+- **System Role** - The minimum entry role needed (owner, contributor, consumer, or none)
+- **Default Entities** - Users or groups automatically assigned to this role on new models
### Who Can Review What?
@@ -123,7 +130,7 @@ The exact review requirements depend on how your administrator has configured th
## Assigning Roles
-To assign all roles on a model:
+All roles on a model are managed from the model's Settings tab:
1. Open the model page
2. Go to the **Settings** tab
diff --git a/frontend/pages/docs/reference/troubleshooting.mdx b/frontend/pages/docs/reference/troubleshooting.mdx
index f732e64def..a26c73cd96 100644
--- a/frontend/pages/docs/reference/troubleshooting.mdx
+++ b/frontend/pages/docs/reference/troubleshooting.mdx
@@ -2,10 +2,19 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Troubleshooting and FAQ
+> **Common questions this page answers:**
+>
+> - Why can't I see a model in the Marketplace?
+> - Why is my release stuck in review?
+> - Why can't I push or pull a container image?
+> - How do I fix token authentication errors?
+
Common issues and answers for Bailo users and administrators.
## Models and the Marketplace
+Common issues with finding, editing, and deleting models.
+
### I can't see a model in the Marketplace
- **Private models** are only visible to collaborators. Ask the model owner to add you, or check whether the model is
@@ -25,6 +34,8 @@ Common issues and answers for Bailo users and administrators.
## Releases
+Common issues with creating releases and the review process.
+
### My release is stuck in review
- Check that **all required review roles** have been assigned to specific people in the model's Settings tab.
@@ -38,6 +49,8 @@ Common issues and answers for Bailo users and administrators.
## Access Requests
+Common issues with access request approval and file downloads.
+
### My access request hasn't been approved
- Access requests are reviewed by the Model Senior Responsible Officer (or equivalent review role). Check who is
@@ -52,6 +65,8 @@ Common issues and answers for Bailo users and administrators.
## Container (Docker) Images
+Common issues with pushing and pulling container images.
+
### I can't push a container image
- Make sure you're using the correct registry address (check with your administrator).
@@ -67,6 +82,8 @@ Common issues and answers for Bailo users and administrators.
## Personal Access Tokens
+Common issues with creating and using Personal Access Tokens (PATs).
+
### How do I create a token?
Navigate to **User (top right) > Settings > Authentication** and click **Add token**. See
@@ -84,6 +101,8 @@ Secret keys are only shown once when the token is created. If you've lost it, de
## Schemas and Forms
+Common issues with schema validation and form fields.
+
### Schema validation errors when filling in a model card
- Required fields are marked - make sure all required fields are filled in.
@@ -97,6 +116,8 @@ Secret keys are only shown once when the token is created. If you've lost it, de
## Security Scanning
+Common issues with file and container image scan results.
+
### A file scan shows issues
- **ClamAV** detects malware. If a file is flagged, do not distribute it until the issue is investigated.
@@ -113,6 +134,8 @@ Secret keys are only shown once when the token is created. If you've lost it, de
## Administration
+Common administration questions.
+
### How do I contact an administrator?
Check the **Help** page in Bailo for support links and contact information specific to your deployment.
From eaf0b3e9c8537f7ff22e11e084aae4b3a2927d48 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 21 May 2026 10:48:00 +0000
Subject: [PATCH 09/23] More RAG optimisation
---
.../microservices/artefact-scanners.mdx | 2 +-
.../users/data-cards/creating-a-data-card.mdx | 16 ++++++++--
.../users/data-cards/managing-data-cards.mdx | 17 +++++++++--
.../docs/users/deletion/file-deletion.mdx | 20 ++++++++++---
.../docs/users/deletion/model-deletion.mdx | 20 ++++++++++---
.../docs/users/deletion/soft-deletion.mdx | 16 +++++++---
.../docs/users/models/creating-a-model.mdx | 29 ++++++++++++-------
.../docs/users/models/creating-a-release.mdx | 28 ++++++++++++++----
.../pages/docs/users/models/model-card.mdx | 26 +++++++++++------
.../docs/users/models/model-templating.mdx | 16 ++++++++--
.../docs/users/models/uploading-files.mdx | 18 ++++++++++--
.../docs/users/models/uploading-images.mdx | 18 ++++++++++--
.../untrusted-models/untrusted-models.mdx | 8 ++++-
13 files changed, 180 insertions(+), 54 deletions(-)
diff --git a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
index 429c2d2d67..19d6e1aced 100644
--- a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
+++ b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
@@ -68,7 +68,7 @@ Trivy is used to analyse container image layers for known vulnerabilities and to
- Scans uploaded image layer tarballs (overlay filesystems)
- Uses a locally cached Trivy vulnerability database
-> Trivy is an open‑source vulnerability scanner from Aqua Security for containers and other artefacts.
+> Trivy is an open-source vulnerability scanner from Aqua Security for containers and other artefacts.
## Minimal Configuration
diff --git a/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx b/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
index 198d820b7f..a143c4158f 100644
--- a/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
+++ b/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
@@ -6,6 +6,12 @@ A **Data Card** documents a dataset used in machine learning - its provenance, s
relationship to models. Data cards help your organisation track what data is being used, where it comes from, and how it
should be handled.
+> **Common questions this page answers:**
+>
+> - How do I create a data card in Bailo?
+> - When should I use a data card instead of a model?
+> - How do I document a dataset?
+
## When to Use a Data Card
Create a data card when you want to:
@@ -18,13 +24,15 @@ Create a data card when you want to:
## Creating a Data Card
+Create a data card from the navigation bar by selecting the Data Card entry type:
+
1. Click the **+ Create** button in the navigation bar
2. Select **Data Card** as the entry type
-3. Fill in the required fields:
+3. Provide the basic information about your dataset through the required fields:
- **Data Card Name**: A clear, descriptive name for the dataset
- **Description**: What the dataset contains and its intended use
- **Access control**: Choose **Public** (visible to all users) or **Private** (visible only to collaborators)
-4. Click **Create data card**
+4. Once you have filled in these details, click **Create data card**
## Selecting a Schema
@@ -42,6 +50,8 @@ Common fields in a data card schema might include:
## Filling In the Data Card
+Work through the form sections to document your dataset, then save to create a versioned record.
+
Once you've selected a schema, the data card form appears. Click **Edit data card** then work through each section,
providing as much detail as you can. The form is divided into tabs based on the schema structure.
@@ -50,7 +60,7 @@ anyone viewing the data card.
## Using the Python Client
-You can also create and manage data cards programmatically using the Python client:
+You can also create and manage data cards programmatically using the Bailo Python client:
```python
from bailo import Client, Datacard
diff --git a/frontend/pages/docs/users/data-cards/managing-data-cards.mdx b/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
index f6e9335699..5cd93c0a02 100644
--- a/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
+++ b/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
@@ -5,9 +5,16 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Once a data card has been created, you can edit its content, view its version history, manage collaborators, and link it
to models.
+> **Common questions this page answers:**
+>
+> - How do I edit a data card?
+> - How do I add collaborators to a data card?
+> - Can I change the schema on a data card?
+> - How do I link a data card to a model?
+
## Editing a Data Card
-To edit a data card:
+Edit a data card by navigating to it and using the Edit data card button:
1. Navigate to the data card page
2. The **Overview** tab shows the current content
@@ -16,7 +23,7 @@ To edit a data card:
## Viewing Version History
-Data cards are versioned - every edit creates a new version. To view the history:
+Every edit creates a new version, and you can view the full history to track changes over time:
1. Open the data card page
2. Navigate to the version history
@@ -26,7 +33,7 @@ This is useful for tracking how documentation has evolved and understanding what
## Managing Collaborators
-Like models, data cards have collaborators with assigned roles:
+Add users or groups as collaborators with specific roles to control access to the data card:
1. Navigate to the **Settings** tab on the data card page
2. Under **Access**, search for users or groups to add as collaborators
@@ -37,6 +44,8 @@ Like models, data cards have collaborators with assigned roles:
## Changing the Schema
+Schema changes are managed through administrator-created migration plans rather than direct switching.
+
It is not possible to directly switch the schema used by a data card, however it is possible for a newer schema to be
published by the Bailo administrators (for example, if your organisation has updated its data governance requirements).
See [Schema Migrations](/docs/administration/schemas/schema-migrations) for further details. Note that changing schemas
@@ -49,6 +58,8 @@ When filling in a model card, look for fields that allow you to reference relate
## Using the Python Client
+Use the Bailo Python client to retrieve and update data cards programmatically:
+
```python
from bailo import Client, Datacard
diff --git a/frontend/pages/docs/users/deletion/file-deletion.mdx b/frontend/pages/docs/users/deletion/file-deletion.mdx
index 669d406305..7972dec29b 100644
--- a/frontend/pages/docs/users/deletion/file-deletion.mdx
+++ b/frontend/pages/docs/users/deletion/file-deletion.mdx
@@ -7,6 +7,12 @@ import bailoDeleteFileConfirm from 'public/docs/bailo_delete_file_confirm.png'
# Deleting a file
+> **Common questions this page answers:**
+>
+> - How do I delete a file from a model?
+> - What happens when I delete a file?
+> - Can I recover a deleted file?
+
Files uploaded to a model can be deleted by authorised users. Deleting a file removes it from use across the model,
including any associated Releases.
@@ -26,6 +32,8 @@ Releases remain, but will no longer reference the deleted file.
## How to delete a file
+Delete a file from the File Management tab using the file actions menu:
+
1. Open the model
2. Navigate to the **Files** tab
3. Locate the file you want to delete
@@ -36,9 +44,11 @@ Releases remain, but will no longer reference the deleted file.
+The screenshot above shows the file actions menu with a Delete File option.
+
## Confirming deletion
-A confirmation dialog is shown before deletion:
+A confirmation dialog lists affected releases before the file is permanently removed:
- If the file is used by releases, those releases are listed
- You must explicitly confirm to proceed
@@ -47,6 +57,8 @@ A confirmation dialog is shown before deletion:
+The screenshot above shows the delete confirmation dialog listing releases that reference the file.
+
If an error occurs (for example, insufficient permissions), an error message will be displayed and the file will not be
deleted.
@@ -58,10 +70,10 @@ deleted.
## About recovery
-File deletion is intended to be **final**.
+File deletion is intended to be **final**, with only rare administrator recovery possible.
-In rare and exceptional circumstances, platform administrators may be able to restore a deleted file. This is **not a
-standard service** and users should only request recovery if absolutely required.
+In exceptional circumstances, platform administrators may be able to restore a deleted file. This is **not a standard
+service** and users should only request recovery if absolutely required.
Before deleting a file, ensure it is no longer required by any releases or users.
diff --git a/frontend/pages/docs/users/deletion/model-deletion.mdx b/frontend/pages/docs/users/deletion/model-deletion.mdx
index ac8170bf69..a20aa81834 100644
--- a/frontend/pages/docs/users/deletion/model-deletion.mdx
+++ b/frontend/pages/docs/users/deletion/model-deletion.mdx
@@ -7,6 +7,12 @@ import bailoDeleteConfirm from 'public/docs/bailo_delete_model_confirm.png'
# Deleting a model
+> **Common questions this page answers:**
+>
+> - How do I delete a model in Bailo?
+> - What happens when I delete a model?
+> - Can I recover a deleted model?
+
Models can be deleted from Bailo by users with the appropriate permissions. Deleting a model removes it from use and
visibility across the platform.
@@ -40,6 +46,8 @@ From a user perspective, the model is gone and cannot be used.
## How to delete a model
+Delete a model from the Settings tab in the Deletion section:
+
1. Open the model
2. Navigate to **Settings**
3. Scroll to the **Deletion** section
@@ -49,9 +57,11 @@ From a user perspective, the model is gone and cannot be used.
+The screenshot above shows the model Settings page with the Deletion section and a Delete Model button.
+
## Confirming deletion
-To prevent accidental deletion, you must confirm the action:
+To prevent accidental deletion, you must type the exact model name to confirm deletion:
1. A confirmation dialog will appear
2. Type the **exact model name** into the confirmation field
@@ -61,6 +71,8 @@ To prevent accidental deletion, you must confirm the action:
+The screenshot above shows the delete confirmation dialog requiring the exact model name to be typed.
+
If the name does not match exactly, the delete button remains disabled.
## After deletion
@@ -71,10 +83,10 @@ If the name does not match exactly, the delete button remains disabled.
## About recovery
-Model deletion is designed to be **final**.
+Model deletion is designed to be **final**, with only rare administrator recovery possible.
-In rare and exceptional circumstances, platform administrators may be able to restore a deleted model. This is **not a
-standard service** and users should only request recovery if absolutely required.
+In exceptional circumstances, platform administrators may be able to restore a deleted model. This is **not a standard
+service** and users should only request recovery if absolutely required.
Before deleting a model, ensure it is no longer needed.
diff --git a/frontend/pages/docs/users/deletion/soft-deletion.mdx b/frontend/pages/docs/users/deletion/soft-deletion.mdx
index 69877716b0..7413499e73 100644
--- a/frontend/pages/docs/users/deletion/soft-deletion.mdx
+++ b/frontend/pages/docs/users/deletion/soft-deletion.mdx
@@ -7,13 +7,19 @@ import bailoDeleteConfirm from 'public/docs/bailo_delete_model_confirm.png'
# Soft deletion
+> **Common questions this page answers:**
+>
+> - What is soft deletion in Bailo?
+> - Can I recover a deleted model or file?
+> - Is deletion permanent?
+
Soft deletion is how Bailo safely removes models and files without immediately destroying them behind the scenes.
-From a user point of view, a soft‑deleted item should be considered **deleted**.
+From a user point of view, a soft-deleted item should be considered **deleted**.
## What you will see
-When something is soft deleted:
+From a user's perspective, soft-deleted items are completely removed from the interface:
- It disappears from the Marketplace and search
- It can no longer be accessed, downloaded, or used
@@ -33,6 +39,8 @@ This approach protects the platform, not individual workflows.
## About recovery
+Recovery is not a standard feature and should not be relied upon.
+
Soft deletion **does not mean undo**.
While platform administrators may technically be able to restore a deleted item, this is:
@@ -45,7 +53,7 @@ Users should **not rely on recovery** and should avoid requesting restoration af
## What you should do before deleting
-Before deleting anything, check:
+Check that the item is no longer needed before proceeding with deletion:
- Whether it is still used by any releases
- Whether other users depend on it
@@ -55,6 +63,6 @@ If in doubt, consider keeping the item or creating a new version instead.
## Key takeaway
-If you delete something in Bailo, assume it is **gone for good**.
+Treat deleted items as **permanently gone**.
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/models/creating-a-model.mdx b/frontend/pages/docs/users/models/creating-a-model.mdx
index b4f5935487..df49e35e73 100644
--- a/frontend/pages/docs/users/models/creating-a-model.mdx
+++ b/frontend/pages/docs/users/models/creating-a-model.mdx
@@ -8,22 +8,30 @@ import DocsWrapper from 'src/docs/DocsWrapper'
This guide walks you through creating a new model in Bailo, from the initial setup through to selecting a schema and
filling in the model card.
+> **Common questions this page answers:**
+>
+> - How do I create a new model in Bailo?
+> - What entry types are available?
+> - How do I choose between public and private visibility?
+
## Choosing an Entry Type
+Bailo supports four entry types. Select the one that matches your use case.
+
Click the **+ Create** button in the navigation bar. You'll see the available entry types:
-| Type | Description |
-| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
-| **Model** | A standard machine learning model with full lifecycle management |
-| **Mirrored Model** | A read-only copy of a model from an external source (see [Model Mirroring](/docs/users/model-mirroring/creating-a-mirrored-model)) |
-| **Untrusted Model** | A model requiring additional scrutiny (if enabled - see [Untrusted Models](/docs/users/untrusted-models)) |
-| **Data Card** | Documentation for a dataset (see [Creating a Data Card](/docs/users/data-cards/creating-a-data-card)) |
+- **Model** - A standard machine learning model with full lifecycle management
+- **Mirrored Model** - A read-only copy of a model from an external source (see
+ [Model Mirroring](/docs/users/model-mirroring/creating-a-mirrored-model))
+- **Untrusted Model** - A model requiring additional scrutiny (if enabled - see
+ [Untrusted Models](/docs/users/untrusted-models))
+- **Data Card** - Documentation for a dataset (see [Creating a Data Card](/docs/users/data-cards/creating-a-data-card))
Select **Model** to create a standard model.
## Basic Details
-Fill in the required fields:
+Every model requires a name, description, and visibility setting:
- **Name** - a clear, descriptive name for your model
- **Description** - what the model does and its intended use
@@ -36,12 +44,13 @@ configured in the model settings.
+The screenshot above shows the marketplace with the model creation button.
+
## Selecting a Schema
-After creating the model, you must select a **schema**. The schema defines the structure of your model card - the
-questions you'll answer about your model.
+The schema determines the structure of your model card - the questions you will answer about your model.
-You have two options:
+After creating the model, you must select a **schema**. You have two options:
- **Create from schema** - select a schema from the available list and start with a blank form
- **Create from template** - copy the model card structure and content from an existing model (see
diff --git a/frontend/pages/docs/users/models/creating-a-release.mdx b/frontend/pages/docs/users/models/creating-a-release.mdx
index 9c1530ef55..9153cb2b8e 100644
--- a/frontend/pages/docs/users/models/creating-a-release.mdx
+++ b/frontend/pages/docs/users/models/creating-a-release.mdx
@@ -9,9 +9,17 @@ import DocsWrapper from 'src/docs/DocsWrapper'
A release is a versioned snapshot of your model at a point in time. Releases bundle together files, container images,
and a reference to a specific model card version. Creating a release triggers the review process.
+> **Common questions this page answers:**
+>
+> - How do I create a release in Bailo?
+> - What is semantic versioning?
+> - What is a minor release?
+> - What happens after I create a release?
+
## What is a Release?
-Releases use [semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`, `2.0.0`):
+Releases use [semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`, `2.0.0`) to track changes to a model
+over time:
- **Major** version (first number): significant changes or breaking changes
- **Minor** version (second number): new features or improvements
@@ -19,6 +27,9 @@ Releases use [semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`,
## Creating a Release
+You create a release from the Releases tab on your model page by filling in a version number, release notes, and
+attaching files or images:
+
1. Open your model page and go to the **Releases** tab
2. Click **Draft new Release**
@@ -26,7 +37,9 @@ Releases use [semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`,
-3. Fill in the release form:
+The screenshot above shows the Releases tab with no releases yet and a 'Draft new Release' button.
+
+3. The release form opens with the following fields to complete:
- **Semver** - the version number for this release (e.g. `1.0.0`)
- **Release notes** - describe what is included in this release
- **Files** - attach uploaded files to this release
@@ -36,7 +49,10 @@ Releases use [semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`,
-4. Click **Create Release** to submit
+The screenshot above shows the release creation form with fields for version number, release notes, file attachments,
+and container image attachments.
+
+4. Once you have filled in the release details and attached any artefacts, click **Create Release** to submit
## Draft vs Published Releases
@@ -45,7 +61,7 @@ reviews are approved, the release is considered published.
## Minor Releases
-You can mark a release as a **minor release** to bypass the review workflow. This is intended for small, low‑risk
+You can mark a release as a **minor release** to bypass the review workflow. This is intended for small, low-risk
updates that do not materially change the behaviour or purpose of the model.
Typical examples include:
@@ -67,7 +83,7 @@ so that it goes through the full review process.
## What Happens After Creation
-Creating a release triggers the review process:
+Creating a release triggers the review process, notifying all assigned reviewers:
1. All review roles assigned to the model are notified
2. Each reviewer evaluates the release
@@ -76,7 +92,7 @@ Creating a release triggers the review process:
## Editing a Release
-To update a release after creation:
+You can update a release's notes, files, and images after creation:
1. Navigate to the **Releases** tab
2. Select the release you want to edit
diff --git a/frontend/pages/docs/users/models/model-card.mdx b/frontend/pages/docs/users/models/model-card.mdx
index 11215207a3..7339599a84 100644
--- a/frontend/pages/docs/users/models/model-card.mdx
+++ b/frontend/pages/docs/users/models/model-card.mdx
@@ -9,6 +9,13 @@ The model card is the structured documentation that describes your model. It cap
training methodology, performance metrics, and known limitations. The questions you see come from the schema you
selected when creating the model.
+> **Common questions this page answers:**
+>
+> - How do I fill in a model card?
+> - How do I add collaborators to a model?
+> - How do I assign review roles?
+> - What is the model card version history?
+
## What is a Model Card?
A model card serves as the authoritative documentation for a machine learning model. It helps:
@@ -19,8 +26,8 @@ A model card serves as the authoritative documentation for a machine learning mo
## Filling In the Form
-The model card form is divided into sections (displayed as tabs). Work through each section, providing as much detail as
-you can.
+The model card form is divided into sections displayed as tabs, where you answer questions defined by the selected
+schema.
- **Required fields** are marked and must be completed
- Your progress is saved only when you click **Save**
@@ -30,7 +37,7 @@ Each edit creates a **new version** of the model card. You can view previous ver
## Configuring Model Access
-Once your model card is filled in, configure who can access the model and who will review it.
+After documenting your model, configure who can access the model and who will review releases and access requests.
1. Open the model and navigate to the **Settings** tab
2. Select **Access** from the side menu
@@ -42,17 +49,18 @@ Once your model card is filled in, configure who can access the model and who wi
+The screenshot above shows the model Settings tab with the Access section, where users and groups can be added as
+collaborators and assigned entry roles and review roles.
+
The selected roles will be notified when the model or its releases require review.
### Entry Roles
When adding collaborators, assign one of:
-| Role | Allows |
-| --------------- | ------------------------------------------------------------- |
-| **Owner** | Full control over the model |
-| **Contributor** | Edit model card, upload files, create releases |
-| **Consumer** | Download files and pull images (with approved access request) |
+- **Owner** - Full control over the model
+- **Contributor** - Edit model card, upload files, create releases
+- **Consumer** - Download files and pull images (with approved access request)
### Review Roles
@@ -61,7 +69,7 @@ Responsible Officer). These people will review releases and access requests.
## Version History
-Every edit to the model card creates a new version. To view the history:
+Every edit to the model card creates a new version that is preserved in the model's history:
1. Open the model page
2. Navigate to the version history
diff --git a/frontend/pages/docs/users/models/model-templating.mdx b/frontend/pages/docs/users/models/model-templating.mdx
index 02138c1559..fd94a8916a 100644
--- a/frontend/pages/docs/users/models/model-templating.mdx
+++ b/frontend/pages/docs/users/models/model-templating.mdx
@@ -6,9 +6,15 @@ Model templating allows you to create a new model based on an existing model's s
when you want to create models that share a similar model card layout or when your organisation has a standard model
card format.
+> **Common questions this page answers:**
+>
+> - How do I create a model from a template?
+> - How do I enable templating on my model?
+> - Can I copy a model card from an existing model?
+
## How Templating Works
-When you create a model from a template:
+Templating copies the model card structure and content from an existing model to a new model:
1. A new model is created with your specified name and description
2. The template model's model card structure and content are copied to the new model
@@ -18,11 +24,15 @@ The template model is not affected - it remains unchanged.
## Prerequisites
+Both the template model and the destination model must meet certain requirements:
+
- The template model must have **Allow templating** enabled in its settings
- You must have already created the new model (templating is applied to an existing model)
## Using a Template
+Apply a template when setting up the model card for a newly created model:
+
1. Create a new model (see [Creating a Model](/docs/users/models/creating-a-model))
2. When prompted to set up the model card, choose **Create from template**
3. Select a template model from the dropdown (only models with templating enabled are shown)
@@ -32,7 +42,7 @@ The template model is not affected - it remains unchanged.
## Enabling Templating on a Model
-If you want other users to be able to use your model as a template:
+Model owners can allow their model to be used as a template by other users:
1. Open your model page
2. Navigate to the **Settings** tab
@@ -43,7 +53,7 @@ Once enabled, your model will appear in the template selection dropdown for othe
## Programmatic Access
-You can also create a model from a template using the API or Python client:
+You can also create a model from a template using the API or the Python client:
**API:**
diff --git a/frontend/pages/docs/users/models/uploading-files.mdx b/frontend/pages/docs/users/models/uploading-files.mdx
index 25fd0fab65..ed2010ee47 100644
--- a/frontend/pages/docs/users/models/uploading-files.mdx
+++ b/frontend/pages/docs/users/models/uploading-files.mdx
@@ -11,9 +11,15 @@ import bailoUploadFile from 'public/docs/bailo_file_upload.png'
Files represent any artefacts related to a model, such as binaries, configuration files, or supporting documentation.
These files allow others to build, evaluate, and use your model.
+> **Common questions this page answers:**
+>
+> - How do I upload files to a model in Bailo?
+> - How do I attach files to a release?
+> - How do I upload files programmatically?
+
## Adding Files to a Model
-Files are uploaded from the **File Management** tab of a model.
+Upload files from the **File Management** tab on your model page:
1. Click **Add new files**
2. Select files to upload
@@ -23,6 +29,8 @@ Files are uploaded from the **File Management** tab of a model.
+The screenshot above shows the file upload interface with file selection, tag assignment, and an Upload files button.
+
4. Click **Upload files**
## Adding Files to a New Release
@@ -33,17 +41,21 @@ When creating a new release, you can attach both newly uploaded files and files
+The screenshot above shows the new release form with a file already attached.
+
## Adding Files to an Existing Release
-Existing releases can be edited to add or remove files.
+You can edit existing releases to add or remove file attachments.
+The screenshot above shows an existing release with an Edit release button for adding or removing files.
+
## Uploading Files Programmatically
-To upload or download files programmatically, use the Bailo Python Client. Examples are available
+Use the Bailo Python Client to upload or download files via code. Examples are available
[here](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html).
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/models/uploading-images.mdx b/frontend/pages/docs/users/models/uploading-images.mdx
index f97b723bfd..bbce59715e 100644
--- a/frontend/pages/docs/users/models/uploading-images.mdx
+++ b/frontend/pages/docs/users/models/uploading-images.mdx
@@ -11,18 +11,28 @@ Bailo uses a container (Docker) registry to store container images associated wi
images are **model-specific**: you push an image to a model first, and then explicitly attach it to one or more
releases.
+> **Common questions this page answers:**
+>
+> - How do I push a container (Docker) image to Bailo?
+> - How do I add a container image to a release?
+> - What is a container image?
+
## Pushing an Image to a Model
-To push a container image to Bailo, navigate to your model and open the **Registry** tab. This tab provides step-by-step
-instructions tailored to your model and registry.
+Push container images to the Bailo registry from the **Registry** tab on your model page.
+
+This tab provides step-by-step instructions tailored to your model and registry.
+The screenshot above shows the Registry tab with step-by-step instructions for logging in, tagging, and pushing a
+container image.
+
## Adding an Image to a Release
-Once the image has been successfully pushed to Bailo's registry, it becomes available to attach to a release.
+Once pushed, container images can be attached to new or existing releases.
Edit an existing release or create a new one, then select the image from the available list.
@@ -30,6 +40,8 @@ Edit an existing release or create a new one, then select the image from the ava
+The screenshot above shows a release being edited with a container image attached from the available list.
+
## What is a Container?
In the context of Bailo, a container is an isolated, self-contained application environment used to run a model.
diff --git a/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx b/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
index 6f4b8d2e71..58495d85b2 100644
--- a/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
+++ b/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
@@ -5,6 +5,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Untrusted models are a special entry type for models that require additional scrutiny before being fully trusted within
your organisation. This feature is optional and must be enabled by your administrator.
+> **Common questions this page answers:**
+>
+> - What is an untrusted model in Bailo?
+> - How do untrusted models differ from regular models?
+> - How do I create an untrusted model?
+
## What are Untrusted Models?
An untrusted model is a model that has not yet been verified or validated to the same standard as a regular model. Your
@@ -18,7 +24,7 @@ that explains what untrusted models mean in your context.
## Creating an Untrusted Model
-If untrusted models are enabled in your Bailo instance:
+Create an untrusted model from the model creation page if the feature is enabled by your administrator:
1. Click the **+ Create** button in the navigation bar
2. Under the **Models** section, select **Untrusted Model**
From b09604fc588c0f84bbc474ae33667541a67fdbe9 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 21 May 2026 10:55:43 +0000
Subject: [PATCH 10/23] More RAG Optimisation
---
.../docs/users/reviews/review-outcomes.mdx | 14 ++++++--
.../docs/users/reviews/reviewing/access.mdx | 12 ++++++-
.../docs/users/reviews/reviewing/releases.mdx | 21 +++++++++++-
.../users/reviews/understanding-reviews.mdx | 32 +++++++++++++------
.../browsing-the-marketplace.mdx | 13 ++++++--
.../users/using-a-model/downloading-files.mdx | 21 +++++++++---
.../users/using-a-model/requesting-access.mdx | 20 ++++++++++--
.../using-a-pushed-docker-image.mdx | 29 ++++++++++++++---
8 files changed, 135 insertions(+), 27 deletions(-)
diff --git a/frontend/pages/docs/users/reviews/review-outcomes.mdx b/frontend/pages/docs/users/reviews/review-outcomes.mdx
index 2a6a21ea27..b528aa7b9d 100644
--- a/frontend/pages/docs/users/reviews/review-outcomes.mdx
+++ b/frontend/pages/docs/users/reviews/review-outcomes.mdx
@@ -5,15 +5,23 @@ import DocsWrapper from 'src/docs/DocsWrapper'
This page explains what happens after a release or access request has been reviewed, including the different outcomes
and what to do when changes are requested.
+> **Common questions this page answers:**
+>
+> - What happens after a release is reviewed?
+> - What do I do when changes are requested?
+> - How do I view review history?
+
## Release Review Outcomes
+A release review can result in approval or a request for changes.
+
### Approved
When all required review roles have approved a release, it is marked as approved and moves to the **Your archived
reviews** tab on the Reviews page. Approved releases are considered final and ready for use.
-Both the **Model Technical Reviewer** and the **Model Senior Responsible Officer** (or equivalent review roles
-configured for the schema) must approve before a release is fully approved.
+Both the **Model Technical Reviewer (MTR)** and the **Model Senior Responsible Officer (MSRO)** (or equivalent review
+roles configured for the schema) must approve before a release is fully approved.
### Changes Requested
@@ -30,6 +38,8 @@ Only the **Owner** and **Contributors** of a model can create releases. See
## Access Request Review Outcomes
+Access request reviews follow a similar approval or change-request flow.
+
### Approved
When the required reviewer approves an access request, the requesting user gains permission to download files and pull
diff --git a/frontend/pages/docs/users/reviews/reviewing/access.mdx b/frontend/pages/docs/users/reviews/reviewing/access.mdx
index f80e4891ec..082c899f5e 100644
--- a/frontend/pages/docs/users/reviews/reviewing/access.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/access.mdx
@@ -6,7 +6,13 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Reviewing an Access Request
When a user submits an access request for a model, it enters the review process. Access request reviews are typically
-handled by the **Model Senior Responsible Officer** (or equivalent review role configured for the schema).
+handled by the **Model Senior Responsible Officer (MSRO)** (or equivalent review role configured for the schema).
+
+> **Common questions this page answers:**
+>
+> - How do I review an access request?
+> - What happens after I approve an access request?
+> - Who reviews access requests?
## Finding Access Requests to Review
@@ -17,8 +23,12 @@ reviews** tab.
+The screenshot above shows the Reviews page with an open access request awaiting review.
+
## Reviewing an Access Request
+Open the access request, examine the requester's details and justification, and submit your decision.
+
1. Select the access request from your review queue
2. Click **View access request** and examine the request details:
- **Who** is requesting access (the requesting user or group)
diff --git a/frontend/pages/docs/users/reviews/reviewing/releases.mdx b/frontend/pages/docs/users/reviews/reviewing/releases.mdx
index c2600c0471..1d850cfb9b 100644
--- a/frontend/pages/docs/users/reviews/reviewing/releases.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/releases.mdx
@@ -10,6 +10,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
When a release is created on a model, it enters the review process. If you have been assigned a review role on that
model, you will be notified and the release will appear in your review queue.
+> **Common questions this page answers:**
+>
+> - How do I review a release in Bailo?
+> - What should I look for when reviewing a release?
+> - Where do I find releases to review?
+
## Who Sees Release Reviews?
Release reviews are visible to users who have been assigned a **review role** on the model (e.g. Model Technical
@@ -24,8 +30,12 @@ reviews** tab, under the **Releases** heading.
+The screenshot above shows the Reviews page with a list of open release reviews waiting for action.
+
## Reviewing a Release
+Open a release from the Reviews page or the model's Releases tab, examine the submission, and submit your decision:
+
1. Either:
- Select a review from the **Reviews** page
- Navigate to the **Releases** page for the model. A **Review** button appears in the release banner
@@ -34,11 +44,14 @@ reviews** tab, under the **Releases** heading.
+The screenshot above shows a release on the model's Releases page with a review banner attached.
+
2. Click **View full release** to examine the release:
- Review the **model card** for completeness and accuracy
- Check the **release notes** describe what is included
- Verify that appropriate **files** and **container images** are attached
-3. Add a **comment** explaining your decision (especially important if requesting changes)
+3. After examining the release details, add a **comment** explaining your decision (especially important if requesting
+ changes)
4. Choose your decision:
- **Approve** - you are satisfied with the release
- **Request changes** - something needs to be addressed
@@ -47,8 +60,12 @@ reviews** tab, under the **Releases** heading.
+The screenshot above shows the release review form with options to approve or request changes, and a comment field.
+
## After Submitting Your Review
+After submitting, the model owner is notified and other reviewers can see your response.
+
- An **email notification** is sent to the model owner with your decision
- If you approved, the release moves closer to full approval (all required roles must approve)
- If you requested changes, the model owner will update the release and you can review again
@@ -56,6 +73,8 @@ reviews** tab, under the **Releases** heading.
## What to Look For
+Different reviewer roles focus on different aspects of the release.
+
Depending on your review role, consider checking:
- **Technical reviewers**: Is the model architecture appropriate? Are evaluation metrics provided? Are known limitations
diff --git a/frontend/pages/docs/users/reviews/understanding-reviews.mdx b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
index 204a5b24ab..3d914dbcb9 100644
--- a/frontend/pages/docs/users/reviews/understanding-reviews.mdx
+++ b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
@@ -5,6 +5,13 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Reviews are Bailo's governance mechanism. They ensure that models and access requests are examined by the right people
before they are approved. This page explains how the review system works end-to-end.
+> **Common questions this page answers:**
+>
+> - How do reviews work in Bailo?
+> - Who reviews my release?
+> - What triggers a review?
+> - What happens when a reviewer requests changes?
+
## What Triggers a Review?
Reviews are created automatically when:
@@ -16,17 +23,22 @@ You do not need to manually create a review. The system handles this based on th
## Who Reviews What?
-Review assignments are determined by three things:
+Review assignments depend on the schema's review roles, the model owner's reviewer assignments, and the type of
+submission:
1. **The schema** attached to the model defines which review roles are required (e.g. "Model Technical Reviewer", "Model
Senior Responsible Officer")
2. **The model owner** assigns specific people or groups to each review role in the model's Settings tab
3. **The type of submission** determines which roles participate:
- **Release reviews**: All assigned review roles participate
- - **Access request reviews**: Typically only specific roles (commonly the MSRO) participate
+ - **Access request reviews**: Typically only specific roles (commonly the Model Senior Responsible Officer, or MSRO)
+ participate
## The Review Lifecycle
+The review lifecycle follows a structured flow from submission through reviewer evaluation to approval or change
+requests.
+
### For Releases
1. A model owner or contributor creates a new release
@@ -47,7 +59,7 @@ Review assignments are determined by three things:
## Checking Your Reviews
-To see reviews assigned to you:
+You can see all reviews assigned to you from the Reviews page in the navigation bar:
1. Click **Review** in the navigation bar
2. The **Your open reviews** tab shows reviews waiting for your action, with a count badge
@@ -55,7 +67,7 @@ To see reviews assigned to you:
## Responding to a Review
-When reviewing a release or access request:
+Reviewers examine the submission, add comments, and choose to approve or request changes:
1. Open the review from the Reviews page or from the model's release/access request page
2. Examine the submission - for releases, review the model card and attached artefacts
@@ -69,14 +81,16 @@ You can also react to other reviewers' comments to indicate agreement or add fur
## Review Outcomes
-| Outcome | What It Means |
-| --------------------- | ----------------------------------------------------------------------------------------- |
-| **Approved** | All required review roles have approved. The release or access request is finalised. |
-| **Changes requested** | One or more reviewers need something addressed. The submitter should update and resubmit. |
-| **Pending** | The review is still in progress - not all required roles have responded yet. |
+A review can result in one of three outcomes.
+
+- **Approved** - All required review roles have approved. The release or access request is finalised.
+- **Changes requested** - One or more reviewers need something addressed. The submitter should update and resubmit.
+- **Pending** - The review is still in progress. Not all required roles have responded yet.
## Tips for Model Owners
+These tips help model owners prepare for smoother reviews.
+
- **Assign reviewers early** - set up review role assignments in your model's Settings tab before creating your first
release
- **Provide thorough model cards** - the more detail you provide, the faster reviews will go
diff --git a/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx b/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
index e801cf796e..bb6ac1e70b 100644
--- a/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
+++ b/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
@@ -5,6 +5,13 @@ import DocsWrapper from 'src/docs/DocsWrapper'
The Marketplace is the main page you see when you log into Bailo. It lists all public models and data cards, providing
search and filtering tools to help you find what you need.
+> **Common questions this page answers:**
+>
+> - How do I find a model in Bailo?
+> - How do I filter models in the Marketplace?
+> - Why can't I see a model?
+> - Can I share a filtered view of the Marketplace?
+
## Searching
Use the search bar at the top left of the Marketplace to find entries by name or description. You need to enter at least
@@ -18,7 +25,7 @@ Search results are limited to the currently selected tab (**Models** or **Data C
## Filtering
-The Marketplace provides several ways to narrow down results:
+The Marketplace provides several filter categories to narrow down results.
### By Entry Type
@@ -57,6 +64,8 @@ Filter models based on your assigned role, showing only those where you hold a s
## Visibility
+Model visibility determines whether a model appears in the Marketplace.
+
- **Public** models are visible to all users in the Marketplace
- **Private** models do not appear in the Marketplace and are only visible to users who have been added as collaborators
@@ -65,7 +74,7 @@ Even for public models, you typically need an approved access request to downloa
## Sharing Filtered Views
Filter selections are stored in the page URL as query parameters. You can copy and share the URL to give someone the
-same filtered view of the Marketplace. **Role‑based filters are not included.**
+same filtered view of the Marketplace. **Role-based filters are not included.**
## Related Pages
diff --git a/frontend/pages/docs/users/using-a-model/downloading-files.mdx b/frontend/pages/docs/users/using-a-model/downloading-files.mdx
index 544ae9a8ae..76d4cada71 100644
--- a/frontend/pages/docs/users/using-a-model/downloading-files.mdx
+++ b/frontend/pages/docs/users/using-a-model/downloading-files.mdx
@@ -8,30 +8,43 @@ import downloadfile3 from 'public/docs/bailo_file_download_release_page.png'
# Downloading Files
-Files can be downloaded in three ways. The final two are exclusively for files with associated releases.
+> **Common questions this page answers:**
+>
+> - How do I download files from a model in Bailo?
+> - Where can I find files to download?
+> - What are the different ways to download files?
+
+Files can be downloaded from three locations in Bailo. The File Management tab provides access to all files, while the
+Releases tab and individual release pages show only files attached to releases.
## From the File Management tab
-Navigate to the **File Management** tab and click the file name to download it.
+Download files directly from the **File Management** tab by clicking the file name.
+The screenshot above shows the File Management tab with clickable file names for direct download.
+
## From the Releases tab
-Open the **Releases** tab and click the download link next to the relevant file.
+Download release-associated files from the **Releases** tab using the download link next to each file.
+The screenshot above shows the Releases tab with download links next to each file in each release.
+
## From a specific release page
-Open an individual release and use the file download link provided.
+Open an individual release page to access file download links for that release.
+The screenshot above shows a specific release page with a file download link.
+
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/using-a-model/requesting-access.mdx b/frontend/pages/docs/users/using-a-model/requesting-access.mdx
index aaa891c67e..ace5a71725 100644
--- a/frontend/pages/docs/users/using-a-model/requesting-access.mdx
+++ b/frontend/pages/docs/users/using-a-model/requesting-access.mdx
@@ -8,6 +8,12 @@ import createAccessRequest from 'public/docs/bailo_create_access_request.png'
# Requesting Access to a Model
+> **Common questions this page answers:**
+>
+> - How do I request access to a model?
+> - What is an access request?
+> - What happens after I submit an access request?
+
## What is an Access Request?
An access request is required before you can use a model. This allows model owners to authorise usage and maintain an
@@ -15,24 +21,32 @@ audit trail of who has access and for what purpose.
## Creating an access request
-Navigate to the model overview page and click **Request Access**.
+Submit an access request from the model overview page by selecting a schema and filling in the required form.
+
+1. Navigate to the model overview page and click **Request Access**.
-Access requests require a schema, similar to model creation. Select the appropriate schema when prompted.
+The screenshot above shows a model overview page with a 'Request Access' button.
+
+2. Access requests require a schema, similar to model creation. Select the appropriate schema when prompted.
-Complete the form and submit the request.
+The screenshot above shows the access request schema selection dialog.
+
+3. Complete the form and submit the request.
+The screenshot above shows the access request form with fields to fill in.
+
## Review process
Once this request has been approved by the necessary role(s), you will be able to download Release artefacts and pull
diff --git a/frontend/pages/docs/users/using-a-model/using-a-pushed-docker-image.mdx b/frontend/pages/docs/users/using-a-model/using-a-pushed-docker-image.mdx
index 176698c6e3..459d03ea26 100644
--- a/frontend/pages/docs/users/using-a-model/using-a-pushed-docker-image.mdx
+++ b/frontend/pages/docs/users/using-a-model/using-a-pushed-docker-image.mdx
@@ -1,5 +1,6 @@
import DocsWrapper from 'src/docs/DocsWrapper'
import Image from 'next/legacy/image'
+import Box from '@mui/material/Box'
import pushingAnImage from '../../../../public/docs/Pushing-an-image.png'
import registryTab from '../../../../public/docs/Registry-tab.png'
@@ -8,12 +9,22 @@ import ModelReleaseImageList from '../../../../public/docs/Model-release-images.
# Model Images
+> **Common questions this page answers:**
+>
+> - How do I push a container (Docker) image to Bailo?
+> - How do I pull a container (Docker) image from Bailo?
+> - How do I add a container image to a release?
+
## Pushing a Docker image
-Docker images can be pushed to the Bailo registry and associated with a specific model. These images can later be used
-in model releases.
+Container (Docker) images can be pushed to the Bailo registry and associated with a specific model. These images can
+later be used in model releases.
+
+
+
+
-
+The screenshot above shows the model Registry tab with a push image button.
The process is:
@@ -28,13 +39,21 @@ The process is:
After pushing an image, it becomes selectable when drafting a release. Choose the image from the dropdown in the release
creation form.
-
+
+
+
+
+The screenshot above shows the image selection dropdown in the release creation form.
## Accessing an image
Images attached to a release are listed in the **Releases** tab.
-
+
+
+
+
+The screenshot above shows a release in the Releases tab with attached container images listed.
You can pull an image using:
From 4bcd33a577553977f8becacb8692b60a3436b125 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Thu, 21 May 2026 11:10:35 +0000
Subject: [PATCH 11/23] Even more RAG Optimisation
---
.../creating-an-inference-service.mdx | 30 +++++----
.../managing-inference-services.mdx | 18 ++++--
.../creating-a-mirrored-model.mdx | 24 +++++--
.../editing-a-mirrored-model-card.mdx | 23 +++++--
.../authentication.mdx | 50 ++++++++++-----
.../programmatically-using-bailo/open-api.mdx | 20 ++++--
.../personal-access-tokens.mdx | 56 +++++++++++------
.../python-client.mdx | 63 +++++++++++--------
.../programmatically-using-bailo/webhooks.mdx | 39 +++++++-----
.../users/using-scanners/file-scanning.mdx | 15 ++++-
.../users/using-scanners/image-scanning.mdx | 43 ++++++++++---
11 files changed, 258 insertions(+), 123 deletions(-)
diff --git a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
index 3e0a51f480..e6e4e87789 100644
--- a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
+++ b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
@@ -5,6 +5,12 @@ import DocsWrapper from 'src/docs/DocsWrapper'
An inference service deploys a model's container (Docker) image as a live endpoint, allowing you to make predictions
without downloading the model locally. This feature must be enabled by your administrator.
+> **Common questions this page answers:**
+>
+> - How do I deploy a model as an inference service?
+> - What processor types are available for inference?
+> - How do I authenticate requests to an inference service?
+
## Prerequisites
Before creating an inference service, you need:
@@ -15,20 +21,18 @@ Before creating an inference service, you need:
## Creating a Service
+Create an inference service from the Inferencing tab on your model page.
+
1. Open your model page
2. Navigate to the **Inferencing** tab
3. Click **Create a new Inferencing Service**
-4. Fill in the form:
-
-| Field | Description | Required |
-| ------------------ | ------------------------------------------------------------ | --------- |
-| **Description** | What this inference service does | Yes |
-| **Image** | Select from the model's available container images | Yes |
-| **Port** | The port your model exposes for inference requests (1-65535) | Yes |
-| **Processor Type** | Choose CPU or an available GPU type | Yes |
-| **Memory** | Memory allocation in GB (1-8 GB, shown for CPU only) | Yes (CPU) |
-
-5. Click **Create Inferencing Service**
+4. Populate the following required fields:
+ - **Description**: What this inference service does. Required.
+ - **Image**: Select from the model's available container images. Required.
+ - **Port**: The port your model exposes for inference requests (1-65535). Required.
+ - **Processor Type**: Choose CPU or an available GPU type. Required.
+ - **Memory**: Memory allocation in GB (1-8 GB, shown for CPU only). Required for CPU.
+5. Once all fields are filled in, click **Create Inferencing Service**
### Choosing a Processor Type
@@ -47,7 +51,7 @@ Check your model's container configuration if you're unsure which port to use.
## After Creation
-Once created, the inference service will be provisioned. You can:
+Once created, the service is provisioned and accessible via an endpoint on the Inferencing tab. You can:
- View the service status on the model's **Inferencing** tab
- Access the service endpoint to make prediction requests
@@ -55,6 +59,8 @@ Once created, the inference service will be provisioned. You can:
## Authenticating Requests
+Use a Personal Access Token (PAT) to authenticate requests to the inference service endpoint.
+
To make authenticated requests to an inference service, you'll need a personal access token. See
[Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) for instructions on creating
one.
diff --git a/frontend/pages/docs/users/inferencing/managing-inference-services.mdx b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
index 14fe863694..9fe2f279ed 100644
--- a/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
+++ b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
@@ -4,21 +4,27 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Once an inference service has been created, you can view its details, update its configuration, or delete it.
+> **Common questions this page answers:**
+>
+> - How do I view my inference services?
+> - How do I update an inference service?
+> - Can I change the container image on an inference service?
+
## Viewing Inference Services
-To see all inference services for a model:
+View all active inference services for a model from the Inferencing tab:
1. Open the model page
-2. Navigate to the **Inferencing** tab
+2. Navigate to the **Inferencing** tab - this is where all services are managed
3. All active inference services are listed with their image, description, and status
## Updating a Service
-To update an inference service's configuration:
+Update an inference service's configuration from the service's settings panel:
1. Navigate to the **Inferencing** tab on the model page
-2. Select the service you want to update
-3. Click **View Settings**
+2. Select the service you want to update - this opens the service detail view
+3. Click **View Settings** to open the configuration panel
4. Modify the fields as needed:
- **Description**
- **Port**
@@ -41,7 +47,7 @@ Deleting a service stops it and removes the deployment. This action cannot be un
## Programmatic Access
-You can also manage inference services [via the API](/api/v2/docs/#/inference).
+Inference services can also be managed [via the API](/api/v2/docs/#/inference).
## Related Pages
diff --git a/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx b/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx
index b7f039541a..41b03c5411 100644
--- a/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx
+++ b/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx
@@ -9,10 +9,16 @@ import tokens from 'public/docs/bailo_tokens.png'
# Creating a mirrored model
+> **Common questions this page answers:**
+>
+> - How do I create a mirrored model in Bailo?
+> - What is model mirroring?
+> - How do I synchronise a mirrored model with its source?
+
## What is model mirroring?
-Model mirroring allows you to create a read-only copy of an existing model that is synchronised from an external source.
-The source model may exist:
+Model mirroring allows you to create a read-only copy of an existing model that is manually synchronised from an
+external source. The source model may exist:
- In another Bailo instance owned by the same organisation, or
- In an external system that supports Bailo model exports
@@ -23,20 +29,24 @@ optionally add additional local context to a mirrored model without modifying th
## How to create a Mirrored Model
-If model mirroring is enabled for your instance, you will be able to create a mirrored model on the model creation page:
+Create a mirrored model from the model creation page if mirroring is enabled for your Bailo instance:
-
+
+The screenshot above shows the model creation page with the Mirrored Model option available.
+
1. Select **Create mirrored model**
2. Provide the basic model details as prompted
3. Enter the **Source Model ID** of the model you want to mirror
-
+
+The screenshot above shows the mirrored model creation form with fields for basic details and the Source Model ID.
+
The Source Model ID must exactly match the ID of the source model. This is used to establish the synchronisation link.
## Exporting the source model
@@ -49,9 +59,11 @@ source model:
3. Export the model
-
+
+The screenshot above shows the source model's export settings used to synchronise the mirrored copy.
+
Once exported, the mirrored model will be populated with the source model's data and kept in sync on subsequent exports.
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/model-mirroring/editing-a-mirrored-model-card.mdx b/frontend/pages/docs/users/model-mirroring/editing-a-mirrored-model-card.mdx
index fcb2543636..23fe8e5d3c 100644
--- a/frontend/pages/docs/users/model-mirroring/editing-a-mirrored-model-card.mdx
+++ b/frontend/pages/docs/users/model-mirroring/editing-a-mirrored-model-card.mdx
@@ -9,6 +9,12 @@ import tokens from 'public/docs/bailo_tokens.png'
# Editing a mirrored model card
+> **Common questions this page answers:**
+>
+> - Can I edit a mirrored model card?
+> - How do I add local information to a mirrored model?
+> - Does editing a mirrored model overwrite the source data?
+
Mirrored models are read-only with respect to information originating from the source model. This ensures the source
model remains the authoritative version.
@@ -16,18 +22,24 @@ You cannot directly edit source content in a mirrored model, however, you can ad
provide context that is specific to your environment or use case.
-
+
+The screenshot above shows a mirrored model card with read-only source content and an Add additional information button.
+
## Adding additional information
+Add local context to a mirrored model without modifying the source data, using the Add additional information button.
+
Instead of an **Edit** button, mirrored models display an **Add additional information** button. Selecting this option
allows you to add local responses alongside the source content:
-
+
+The screenshot above shows the form for adding local information alongside the source model's content.
+
Key points:
- Additional information does not overwrite source data
@@ -39,13 +51,14 @@ Key points:
## How additional information is displayed
-Once saved, your additional information is shown beneath the source answer. This makes it clear which content originates
-from the source model and which content is locally added.
+Local additions appear beneath the source content, making the origin of each piece of information clear.
-
+
+The screenshot above shows the model card with source content and locally added information displayed separately.
+
Additional information can be updated at any time and will persist across future synchronisations when the source model
is re-exported.
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
index b6313987bc..7de3d5b7b1 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
@@ -7,20 +7,29 @@ import tokens from 'public/docs/bailo_tokens.png'
# Programmatic Authentication with Bailo
-Bailo supports two authentication methods for programmatic access: PKI certificates and personal access tokens. Choose
-the method that suits your environment.
+Bailo supports two authentication methods for programmatic access: PKI (Public Key Infrastructure) certificates and
+personal access tokens. Choose the method that suits your environment.
+
+> **Common questions this page answers:**
+>
+> - How do I authenticate with the Bailo API?
+> - Should I use PKI certificates or personal access tokens?
+> - How do I use the Python client with authentication?
+> - How do I use curl to call the Bailo API?
## Which Method Should I Use?
-| Method | Best for | Requirements |
-| ---------------------- | ---------------------------------------------------------- | ----------------------------------------------- |
-| **PKI (certificates)** | Organisations with PKI infrastructure, automated pipelines | Client certificate, private key, CA certificate |
-| **Token-based** | Individual users, quick setup, scoped access | A Bailo account to generate tokens |
+Choose between PKI certificate authentication and token-based authentication depending on your environment.
+
+- **PKI (Public Key Infrastructure) certificates** - Best for organisations with PKI infrastructure and automated
+ pipelines. Requires a client certificate, private key, and CA (Certificate Authority) certificate.
+- **Token-based (Personal Access Tokens)** - Best for individual users, quick setup, and scoped access. Requires a Bailo
+ account to generate tokens.
## Public Key Infrastructure (PKI)
-PKI-based authentication uses client certificates to sign requests. This is the recommended method for environments
-where mutual TLS is standard.
+PKI-based authentication uses mutual TLS (Transport Layer Security) with client certificates to sign requests. This is
+the recommended method for environments where mutual TLS is standard.
### Setup
@@ -55,8 +64,10 @@ curl --cert path/to/client-cert.pem \
## Token-based Authentication
-If you are not using PKI, Bailo allows the use of personal access tokens for fine-grained access. Tokens grant access to
-specific models and specific actions.
+Token-based authentication uses Personal Access Tokens (PATs) for fine-grained, scoped API access.
+
+If you are not using PKI, Bailo allows the use of PATs for fine-grained access. Tokens grant access to specific models
+and specific actions.
### Creating a Token
@@ -67,6 +78,9 @@ specific models and specific actions.
+The screenshot above shows the Authentication tab in Bailo's user settings, listing existing personal access tokens with
+an 'Add token' button.
+
3. Configure the token:
- **Description** - a name to help you identify this token
- **Scope** - choose "All models" or select specific models
@@ -78,6 +92,8 @@ specific models and specific actions.
+The screenshot above shows the token creation confirmation dialog displaying the access key and secret key.
+
### Using Tokens with the Python Client
```python
@@ -102,6 +118,8 @@ curl -u "your-access-key:your-secret-key" \
## Security Best Practices
+Follow these practices to keep your API credentials secure.
+
- **Never commit tokens to source control** - use environment variables or secret managers
- **Use the minimum required permissions** - only grant the actions your workflow needs
- **Scope tokens to specific models** when possible, rather than "All models"
@@ -116,12 +134,12 @@ such as `verify`.
## Troubleshooting
-| Issue | Solution |
-| -------------------- | ------------------------------------------------------------------------------------- |
-| `401 Unauthorized` | Check your credentials are correct and the token hasn't been deleted |
-| `403 Forbidden` | Your token may not have the right permissions or model scope |
-| Certificate errors | Verify your certificate paths and that the CA certificate matches your Bailo instance |
-| `Connection refused` | Check the Bailo URL is correct and the instance is running |
+Common authentication errors and their solutions.
+
+- **401 Unauthorized** - Check your credentials are correct and the token hasn't been deleted
+- **403 Forbidden** - Your token may not have the right permissions or model scope
+- **Certificate errors** - Verify your certificate paths and that the CA certificate matches your Bailo instance
+- **Connection refused** - Check the Bailo URL is correct and the instance is running
## Related Pages
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
index 958154b0d5..d441b1a915 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
@@ -6,7 +6,15 @@ import bailoSwaggerDocs from 'public/docs/bailo_swagger_docs.png'
# OpenAPI Documentation
-Bailo provides a full OpenAPI specification for all API endpoints, viewable through an interactive Swagger UI.
+> **Common questions this page answers:**
+>
+> - Where is the Bailo API documentation?
+> - How do I test API endpoints?
+> - How do I download the OpenAPI specification?
+
+Bailo provides a full OpenAPI (a standard format for describing REST APIs) specification for all API (Application
+Programming Interface) endpoints, viewable through an interactive Swagger (an open-source toolset for building and
+documenting APIs) UI.
## Accessing the Documentation
@@ -16,9 +24,13 @@ The interactive API documentation is available at [`/api/v2/docs/`](/api/v2/docs
+The screenshot above shows the Swagger UI interface with grouped API endpoints, request parameters, and response
+schemas.
+
## Using Swagger UI
-The Swagger UI lets you browse, understand, and test API endpoints directly in your browser.
+Swagger UI lets you browse, understand, and test API (Application Programming Interface) endpoints directly in your
+browser.
### Browsing Endpoints
@@ -46,7 +58,7 @@ You can test endpoints directly from the Swagger UI:
## Downloading the OpenAPI Specification
-To download the raw OpenAPI specification (useful for code generation or importing into API tools):
+Download the raw OpenAPI specification in JSON format for use with code generation tools or API clients.
- Navigate to `/api/v2/specification` on your Bailo instance
- The response is the full OpenAPI JSON specification
@@ -59,7 +71,7 @@ You can use this specification with tools like:
## Endpoint Summary
-For a complete list of all API endpoints organised by domain, see the [Swagger API](/api/v2/docs).
+For a complete list of all API endpoints, see the interactive [Swagger API](/api/v2/docs).
For guidance on Swagger UI itself, see the [official Swagger documentation](https://swagger.io/tools/swagger-ui/).
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
index 4ea0ee3e08..7c310c65aa 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
@@ -10,8 +10,17 @@ import createPersonalAccessToken from 'public/docs/bailo_create_personal_access_
Personal Access Tokens (PATs) allow you to authenticate with Bailo's API and container registry programmatically. Each
token can be scoped to specific models and actions, giving you fine-grained control over what the token can do.
+> **Common questions this page answers:**
+>
+> - How do I create a Personal Access Token (PAT)?
+> - What permissions can I assign to a token?
+> - How do I use a token with curl or the Python client?
+> - How do I revoke a token?
+
## Creating a Token
+Create tokens from the Authentication tab in your user settings.
+
1. Navigate to **User (top right) > Settings > Authentication**
2. Click **Add Token**
@@ -19,6 +28,9 @@ token can be scoped to specific models and actions, giving you fine-grained cont
+The screenshot above shows the Authentication tab listing existing personal access tokens with their descriptions,
+access keys, and a delete button for each.
+
3. Fill in the form:
- **Description** - a name to help you identify this token (e.g. "CI/CD pipeline", "Local development")
- **Models** - choose **All models** or select specific models
@@ -28,34 +40,38 @@ token can be scoped to specific models and actions, giving you fine-grained cont
+The screenshot above shows the token creation form with fields for description, model scope, and action permissions.
+
4. Click **Generate Token**
5. **Copy both the Access Key and Secret Key immediately** - the secret key is only shown once and cannot be retrieved
later
## Available Permissions
-| Permission | Description |
-| ---------------------- | ----------------------------------------------- |
-| `model:read` | View model and data card settings |
-| `model:write` | Create and update model and data card settings |
-| `model:export` | Export model and data card settings |
-| `release:read` | View release information |
-| `release:write` | Create and update releases |
-| `release:export` | Export release information |
-| `access_request:read` | View and list access requests |
-| `access_request:write` | Create, approve, and comment on access requests |
-| `file:read` | Download and view files |
-| `file:write` | Upload and delete files |
-| `image:read` | List and pull container (Docker) images |
-| `image:write` | Push and delete container images |
-| `schema:write` | Upload and modify schemas (administrators only) |
-| `reviewRole:read` | View review roles |
-| `reviewRole:write` | Create and update review roles |
+Each token can be scoped to specific actions using these permission types.
+
+- **model:read** - View model and data card settings
+- **model:write** - Create and update model and data card settings
+- **model:export** - Export model and data card settings
+- **release:read** - View release information
+- **release:write** - Create and update releases
+- **release:export** - Export release information
+- **access_request:read** - View and list access requests
+- **access_request:write** - Create, approve, and comment on access requests
+- **file:read** - Download and view files
+- **file:write** - Upload and delete files
+- **image:read** - List and pull container (Docker) images
+- **image:write** - Push and delete container images
+- **schema:write** - Upload and modify schemas (administrators only)
+- **reviewRole:read** - View review roles
+- **reviewRole:write** - Create and update review roles
> **Note**: Selecting a write permission automatically includes the corresponding read permission.
## Token Scoping
+Tokens can be scoped to all models or restricted to specific models.
+
- **All models** - the token works with every model in Bailo
- **Specific models** - the token only works with the models you select
@@ -63,7 +79,7 @@ Use specific model scoping when possible to follow the principle of least privil
## Managing Tokens
-To view or delete existing tokens:
+View and delete existing tokens from the Authentication tab:
1. Navigate to **User > Settings > Authentication**
2. Your existing tokens are listed with their description and access key
@@ -74,7 +90,7 @@ To view or delete existing tokens:
## Using Tokens
-Tokens use HTTP Basic Authentication:
+Tokens use HTTP Basic Authentication with the access key as the username and the secret key as the password.
- **Username**: the access key
- **Password**: the secret key
@@ -103,6 +119,8 @@ docker login your-registry-host -u "your-access-key" -p "your-secret-key"
## Security Best Practices
+Follow these practices to keep your tokens secure.
+
- **Store secret keys securely** - use environment variables or a secrets manager, not source code
- **Use minimum permissions** - only grant the actions your workflow needs
- **Scope to specific models** when possible
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
index afbf06ff6b..cd41e0c790 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
@@ -2,13 +2,22 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Python Client
-Bailo provides a Python client that wraps the API into high-level helper classes. The package is published on
-[PyPI](https://pypi.org/project/bailo/).
+Bailo provides a Python client that wraps the API (Application Programming Interface) into high-level helper classes.
+The package is published on [PyPI (Python Package Index)](https://pypi.org/project/bailo/).
+
+> **Common questions this page answers:**
+>
+> - How do I use the Bailo Python client?
+> - How do I create a model programmatically?
+> - How do I upload files and create releases with Python?
+> - How do I authenticate the Python client?
**Full API documentation is available [here](../../python/index.html).**
## Installation
+Install the Bailo Python client from PyPI using pip.
+
```bash
pip install bailo
```
@@ -21,7 +30,8 @@ pip install bailo[mlflow]
## Authentication
-Before using the client, you need to set up authentication. Bailo supports two methods:
+Before using the client, configure authentication using either PKI (Public Key Infrastructure) certificates or Personal
+Access Tokens.
### PKI Certificate Authentication (Recommended)
@@ -60,19 +70,19 @@ client = Client(
## Helper Classes
-The Python client provides high-level helper classes that simplify common workflows:
+The Python client provides high-level helper classes that simplify common workflows.
-| Class | Purpose |
-| --------------- | ----------------------------------------------- |
-| `Model` | Create, retrieve, and manage models |
-| `Datacard` | Create and manage data cards |
-| `Release` | Create versioned releases with files and images |
-| `AccessRequest` | Submit and manage access requests |
-| `Schema` | Create and retrieve schemas |
-| `Experiment` | Track experiments and metrics |
+- **Model** - Create, retrieve, and manage models
+- **Datacard** - Create and manage data cards
+- **Release** - Create versioned releases with files and images
+- **AccessRequest** - Submit and manage access requests
+- **Schema** - Create and retrieve schemas
+- **Experiment** - Track experiments and metrics
## Common Workflows
+These examples show the most common tasks you can perform with the Python client.
+
### Creating a Model
```python
@@ -197,7 +207,7 @@ schema = Schema.create(
## Jupyter Notebook Examples
-Detailed, runnable examples are available as Jupyter notebooks:
+Detailed, runnable examples are available as Jupyter notebooks in the Bailo repository.
- [Models and Releases (PyTorch)](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html) - End-to-end model
creation, file upload, and release management
@@ -208,7 +218,7 @@ Detailed, runnable examples are available as Jupyter notebooks:
## MLflow Integration
-The optional MLflow integration allows you to log models from MLflow directly to Bailo:
+The optional MLflow integration allows you to log models from MLflow directly to Bailo.
```bash
pip install bailo[mlflow]
@@ -219,19 +229,18 @@ artefacts to Bailo for governance and distribution.
## Low-Level Client Methods
-For advanced use cases, the `Client` class exposes lower-level methods that map directly to API endpoints:
-
-| Category | Methods |
-| ------------------- | ------------------------------------------------------------------------------------------------------------------- |
-| **Models** | `post_model`, `get_model`, `get_models`, `patch_model`, `delete_model` |
-| **Model Cards** | `get_model_card`, `put_model_card`, `model_card_from_schema`, `model_card_from_template` |
-| **Releases** | `post_release`, `get_release`, `get_all_releases`, `put_release`, `delete_release` |
-| **Files** | `simple_upload`, `get_files`, `get_download_file`, `get_download_by_filename`, `delete_file` |
-| **Access Requests** | `post_access_request`, `get_access_request`, `get_access_requests`, `patch_access_request`, `delete_access_request` |
-| **Schemas** | `get_all_schemas`, `get_schema`, `post_schema` |
-| **Reviews** | `get_reviews`, `post_release_review`, `post_access_request_review` |
-| **Scanning** | `put_file_scan`, `put_image_scan` |
-| **Roles** | `get_model_roles` |
+For advanced use cases, the `Client` class exposes lower-level methods that map directly to API endpoints.
+
+- **Models** - `post_model`, `get_model`, `get_models`, `patch_model`, `delete_model`
+- **Model Cards** - `get_model_card`, `put_model_card`, `model_card_from_schema`, `model_card_from_template`
+- **Releases** - `post_release`, `get_release`, `get_all_releases`, `put_release`, `delete_release`
+- **Files** - `simple_upload`, `get_files`, `get_download_file`, `get_download_by_filename`, `delete_file`
+- **Access Requests** - `post_access_request`, `get_access_request`, `get_access_requests`, `patch_access_request`,
+ `delete_access_request`
+- **Schemas** - `get_all_schemas`, `get_schema`, `post_schema`
+- **Reviews** - `get_reviews`, `post_release_review`, `post_access_request_review`
+- **Scanning** - `put_file_scan`, `put_image_scan`
+- **Roles** - `get_model_roles`
Refer to the [full API documentation](../../python/index.html) for detailed method signatures and parameters.
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
index f2ef8fabab..3c3e4bc033 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
@@ -2,13 +2,20 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Webhooks
+> **Common questions this page answers:**
+>
+> - How do I set up a webhook in Bailo?
+> - What events can trigger webhooks?
+> - How do I update or delete a webhook?
+> - How do I secure webhook requests?
+
Bailo provides webhooks for programmatic, event-driven interactions with individual models. When certain events occur on
a model, Bailo sends an HTTP POST request to a URL you specify, allowing you to integrate with external applications and
workflows.
## Setting Up a Webhook
-Webhooks are managed through the API. To create a webhook for a model:
+Create webhooks through the API by sending a POST request with the webhook configuration:
```bash
curl -X POST https://your-bailo-instance.com/api/v2/model/{modelId}/webhooks \
@@ -26,29 +33,25 @@ curl -X POST https://your-bailo-instance.com/api/v2/model/{modelId}/webhooks \
### Webhook Configuration Options
-| Field | Description | Required |
-| --------------- | ------------------------------------------------------------------------- | ---------------------- |
-| **name** | A descriptive name for the webhook | Yes |
-| **uri** | The URL that will receive the POST requests | Yes |
-| **token** | A bearer token included in the `Authorization` header of webhook requests | No |
-| **events** | Which events trigger this webhook (see below) | No (defaults to all) |
-| **active** | Whether the webhook is enabled | No (defaults to true) |
-| **insecureSSL** | Skip SSL verification for the target URL | No (defaults to false) |
+- **name** - A descriptive name for the webhook. Required.
+- **uri** - The URI (Uniform Resource Identifier) that will receive the POST requests. Required.
+- **token** - A bearer token included in the `Authorization` header of webhook requests. Optional.
+- **events** - Which events trigger this webhook (see Events below). Optional, defaults to all events.
+- **active** - Whether the webhook is enabled. Optional, defaults to true.
+- **insecureSSL** - Skip SSL (Secure Sockets Layer) verification for the target URL. Optional, defaults to false.
## Events
A Bailo model's webhook can be triggered by the following events:
-| Event | When It Fires |
-| ---------------------- | ---------------------------------------------------------- |
-| `createRelease` | A new release is created on the model |
-| `updateRelease` | An existing release is updated |
-| `createReviewResponse` | A reviewer submits a response (approval or change request) |
-| `createAccessRequest` | A user submits an access request for the model |
+- **createRelease** - Fires when a new release is created on the model
+- **updateRelease** - Fires when an existing release is updated
+- **createReviewResponse** - Fires when a reviewer submits a response (approval or change request)
+- **createAccessRequest** - Fires when a user submits an access request for the model
## Request Format
-When a webhook is triggered, it sends a `POST` request to the webhook's URI.
+When triggered, Bailo sends a POST request to the webhook's URI (Uniform Resource Identifier) with event-specific data.
The webhook includes `"Authorization": "Bearer "` in the request `headers` if the webhook has a token configured.
@@ -122,6 +125,8 @@ The body of the webhook's request varies depending on the type of event.
## Managing Webhooks
+List, update, and delete webhooks using the API.
+
### Listing Webhooks
```bash
@@ -152,6 +157,8 @@ curl -X DELETE https://your-bailo-instance.com/api/v2/model/{modelId}/webhook/{w
## Security Considerations
+Follow these practices to secure your webhook endpoints.
+
- **Use the token field** to include a bearer token in webhook requests, so your receiving service can verify the
request came from Bailo
- **Use HTTPS** for your webhook URI to prevent eavesdropping on the request payloads
diff --git a/frontend/pages/docs/users/using-scanners/file-scanning.mdx b/frontend/pages/docs/users/using-scanners/file-scanning.mdx
index 99e7a5269e..51eb1c938a 100644
--- a/frontend/pages/docs/users/using-scanners/file-scanning.mdx
+++ b/frontend/pages/docs/users/using-scanners/file-scanning.mdx
@@ -7,6 +7,12 @@ import rescanView from 'public/docs/bailo_file_rescan.png'
# Scanning Files
+> **Common questions this page answers:**
+>
+> - How are files scanned in Bailo?
+> - What scanners are used for file scanning?
+> - How do I rescan a file?
+
## Using Scanners
When uploading files to Bailo, your files will be automatically scanned (assuming scanners are configured and
@@ -18,7 +24,7 @@ By default, Bailo is configured to use the following scanners:
[here](https://www.clamav.net/).
- ModelScan is a tool used to prevent model serialisation attacks, across a variety of formats. You can read more about
it [here](https://github.com/protectai/modelscan/tree/main). ModelScan is packaged in
- [Bailo Artefact Scan](/docs/administration/microservices/artefact-scanners)
+ [Bailo ArtefactScan](/docs/administration/microservices/artefact-scanners)
For scan results:
@@ -30,6 +36,9 @@ For scan results:
+The screenshot above shows a file in the File Management tab with a scan status chip that can be clicked to view scan
+results.
+
## Rescan File
To rescan a file after it has been uploaded, click the 3 dots to the right of the scan results chip and select the
@@ -39,7 +48,9 @@ Rescan option.
-
+The screenshot above shows the file actions menu with a Rescan option for re-running security scans.
+
+
There is a cool-down period for rerunning a scan that is configured by your administrator
diff --git a/frontend/pages/docs/users/using-scanners/image-scanning.mdx b/frontend/pages/docs/users/using-scanners/image-scanning.mdx
index 2de3a0e047..2b5cb55c58 100644
--- a/frontend/pages/docs/users/using-scanners/image-scanning.mdx
+++ b/frontend/pages/docs/users/using-scanners/image-scanning.mdx
@@ -10,13 +10,21 @@ import multiPlatView from 'public/docs/bailo_image_multiplat_view.png'
# Scanning Images
+> **Common questions this page answers:**
+>
+> - How are container images scanned in Bailo?
+> - How do I view vulnerability details for a container image?
+> - What is a CVE?
+> - How do I rescan an image?
+
## Using Scanner
-When pushing images up to the Bailo container registry, your images are automatically scanned. By default, Bailo is
-configured to use Trivy. Trivy is packaged in
-[Bailo Artefact Scan](/docs/administration/microservices/artefact-scanners) Trivy is a static analysis tool focused on
-the security of containers, and informing users about potential issues. You can read more about the principles and scope
-of Trivy [here](https://trivy.dev/docs/latest/community/principles/).
+Container images pushed to the Bailo registry are automatically scanned using Trivy, a vulnerability scanner that
+detects known security issues called CVEs (Common Vulnerabilities and Exposures).
+
+Trivy is a static analysis tool focused on the security of containers, and informing users about potential issues,
+packaged in [Bailo ArtefactScan](/docs/administration/microservices/artefact-scanners). You can read more about the
+principles and scope of Trivy [here](https://trivy.dev/docs/latest/community/principles/).
For scan results:
@@ -28,7 +36,10 @@ For scan results:
-## Detailed View
+The screenshot above shows the scan status chip on a container image in the Registry tab, with vulnerability counts
+grouped by severity.
+
+## Detailed view
To view more detail, click the 'See detailed results' button. This will take you to the vulnerability report page, which
includes the following information:
@@ -44,24 +55,36 @@ You can filter these results by Severity, using the tags at the top of the page.
+The screenshot above shows the detailed vulnerability report page with CVE information and severity filters.
+
## Rescan Image
-If you want to rescan, click the 3 dots to the right of the scan results chip and select the Rescan option.
+Trigger a rescan of a container image from the scan results menu.
+
+1. Click the 3 dots to the right of the scan results chip
+2. Click **Rerun image scan**
+The screenshot above shows the image actions menu with a Rescan option.
+
## Multiplatform Images
-A multiplatform image will appear with a purple tag next to the name
+Bailo supports scanning multiplatform images, which target different architectures.
+
+
+ A multiplatform image will appear with a purple tag next to the name
+
Bailo also allows you to scan multiplatform images, which are images that point to a different set of layers based on
-your host architecture. You can also click the 'See detailed results' button, and view the platform-specific, detailed
-results page.
+your host architecture. Click the **See detailed results** button to view the platform-specific, detailed results page.
+The screenshot above shows a multiplatform image summary with platform-specific vulnerability breakdowns.
+
export default ({ children }) => {children}
From 1bfecf59191df00a4fd30b86baec835eead60a10 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Wed, 3 Jun 2026 10:37:09 +0100
Subject: [PATCH 12/23] Apply suggestions from code review
Co-authored-by: GB907762 <241953074+GB907762@users.noreply.github.com>
---
.../docs/administration/federation/peer-integration.mdx | 9 +--------
.../administration/microservices/artefact-scanners.mdx | 2 +-
2 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/frontend/pages/docs/administration/federation/peer-integration.mdx b/frontend/pages/docs/administration/federation/peer-integration.mdx
index 1ea7205b75..b518b3d7ae 100644
--- a/frontend/pages/docs/administration/federation/peer-integration.mdx
+++ b/frontend/pages/docs/administration/federation/peer-integration.mdx
@@ -51,7 +51,7 @@ When federation is enabled and peers are configured:
- Users see a **filter by external sources** option in the Marketplace
- Models from external sources appear alongside local models
- Each external model shows its source
-- External models can be mirrored to create local read-only copies
+- External models can be clicked to view the source
## Checking Peer Status
@@ -61,13 +61,6 @@ You can check the status of connected peers [via the API](/api/v2/docs/#/system)
Each peer has a reachability status indicating whether Bailo can communicate with it.
-## Model Mirroring via Federation
-
-Users can create read-only mirrored models from federated external sources.
-
-When federation is enabled, users can create **Mirrored Models** from external sources. These are read-only copies that
-require periodic updates to stay in sync with the source. See
-[Creating a Mirrored Model](/docs/users/model-mirroring/creating-a-mirrored-model) for details.
## Related Pages
diff --git a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
index 19d6e1aced..34453078ae 100644
--- a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
+++ b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
@@ -72,7 +72,7 @@ Trivy is used to analyse container image layers for known vulnerabilities and to
## Minimal Configuration
-Configure scanner settings in the backend application configuration.
+Configure scanner settings in the backend application configuration. These settings will apply to all scanners.
- **connectors.artefactScanners.kinds** - List of enabled artefact scanner kinds. Default: `[]`.
- **connectors.artefactScanners.retryDelayInMinutes** - Minutes between repeated scans of the same artefact. Default:
From 895b09eb8a846525e6a85eed41bb4834d8724c4d Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Wed, 3 Jun 2026 09:53:15 +0000
Subject: [PATCH 13/23] PR feedback suggestions
---
.../getting-started/app-configuration.mdx | 11 +++--
.../deployment-architecture.mdx | 43 +++++++++++++++++++
2 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/frontend/pages/docs/administration/getting-started/app-configuration.mdx b/frontend/pages/docs/administration/getting-started/app-configuration.mdx
index 432ebf7768..a94904f21f 100644
--- a/frontend/pages/docs/administration/getting-started/app-configuration.mdx
+++ b/frontend/pages/docs/administration/getting-started/app-configuration.mdx
@@ -1,4 +1,5 @@
import DocsWrapper from 'src/docs/DocsWrapper'
+import Alert from '@mui/material/Alert'
# App Configuration
@@ -10,9 +11,13 @@ import DocsWrapper from 'src/docs/DocsWrapper'
## Configuration Files
-> ⚠️ Note: If you use Helm this information does not apply to you. We use Helm to automatically configure the
-> application for you. Within helm you can manually alter this configuration in
-> `infrastructure/helm/bailo/templates/bailo/bailo.configmap.yaml`
+
+If you use Helm this information does not apply to you.
+
+We use Helm to automatically configure the application for you. Within helm you can manually alter this configuration in
+`infrastructure/helm/bailo/templates/bailo/bailo.configmap.yaml`
+
+
Bailo uses [`node-config`](https://github.com/node-config/node-config#readme) for application configuration.
`node-config` organizes hierarchical configurations, allowing the user to set a series of overrides over a base
diff --git a/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
index 0a42cd3d93..c96a743bd2 100644
--- a/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
+++ b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
@@ -1,4 +1,5 @@
import DocsWrapper from 'src/docs/DocsWrapper'
+import Alert from '@mui/material/Alert'
# Deployment Architecture
@@ -66,6 +67,48 @@ For production deployments, Bailo provides Helm charts for deploying to Kubernet
- [Helm Configuration](/docs/administration/helm/configuration)
- [Isolated Environments](/docs/administration/helm/isolated-environments)
+### Standalone Dockerfile
+
+
+ `Dockerfile.standalone` is intended for local testing and secondary-instance scenarios. It should **not** be used as
+ the recommended production deployment model. Use Helm for production Kubernetes deployments.
+
+
+`Dockerfile.standalone` builds a single container that runs a self-contained Bailo instance. It packages the frontend,
+backend, NGINX, MongoDB, MinIO, the container registry, and Mailcrab into one image using `supervisord`.
+
+This is not the normal development path. For day-to-day local development, use `compose.yaml`, because it runs each
+service separately and supports rebuilding, inspecting, and restarting individual services more easily.
+
+Use the standalone Dockerfile when you need an additional Bailo instance alongside your main Docker Compose instance,
+for example:
+
+- Testing cross-instance functionality, such as searching for models in another Bailo instance
+- Running a second local instance without starting another full Compose project
+- Creating a compact demo or smoke-test instance
+- Checking behaviour where one Bailo deployment needs to communicate with another
+
+To use it, first start your main Bailo instance with Docker Compose:
+
+```bash
+docker compose build --parallel
+docker compose up -d
+```
+
+The main instance is then available at `http://localhost:8080`.
+
+Build and run the standalone image from the repository root:
+
+```bash
+docker build . -t second-bailo -f Dockerfile.standalone
+docker run --rm -p 4318:8080 --network dev_internal --name second-bailo second-bailo:latest
+```
+
+The standalone instance is then available at `http://localhost:4318`.
+
+If your Compose instance uses a different `INSTANCE_NAME`, replace `dev_internal` with the matching internal network
+name, for example `_internal`.
+
## Data Storage
Bailo stores structured metadata in MongoDB and binary artefacts in S3-compatible object storage:
From beb6e2a693ad84c1358b71abc99f96836cc64876 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Wed, 3 Jun 2026 10:24:26 +0000
Subject: [PATCH 14/23] Update API Docs URL
---
.../pages/docs/administration/federation/peer-integration.mdx | 3 +--
.../docs/users/inferencing/managing-inference-services.mdx | 2 +-
.../users/programmatically-using-bailo/authentication.mdx | 2 +-
.../docs/users/programmatically-using-bailo/open-api.mdx | 4 ++--
.../programmatically-using-bailo/personal-access-tokens.mdx | 2 +-
.../docs/users/programmatically-using-bailo/webhooks.mdx | 2 +-
6 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/frontend/pages/docs/administration/federation/peer-integration.mdx b/frontend/pages/docs/administration/federation/peer-integration.mdx
index b518b3d7ae..eb14a62f08 100644
--- a/frontend/pages/docs/administration/federation/peer-integration.mdx
+++ b/frontend/pages/docs/administration/federation/peer-integration.mdx
@@ -57,11 +57,10 @@ When federation is enabled and peers are configured:
Check the reachability of connected peers through the API.
-You can check the status of connected peers [via the API](/api/v2/docs/#/system).
+You can check the status of connected peers [via the API](/api/docs//#/system).
Each peer has a reachability status indicating whether Bailo can communicate with it.
-
## Related Pages
- [App Configuration](/docs/administration/getting-started/app-configuration) - Where peers are configured
diff --git a/frontend/pages/docs/users/inferencing/managing-inference-services.mdx b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
index 9fe2f279ed..955b07a28e 100644
--- a/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
+++ b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
@@ -47,7 +47,7 @@ Deleting a service stops it and removes the deployment. This action cannot be un
## Programmatic Access
-Inference services can also be managed [via the API](/api/v2/docs/#/inference).
+Inference services can also be managed [via the API](/api/docs//#/inference).
## Related Pages
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
index 7de3d5b7b1..a330664c9f 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
@@ -145,6 +145,6 @@ Common authentication errors and their solutions.
- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Detailed token management
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using the Python client library
-- [Swagger API](/api/v2/docs) - All available API endpoints
+- [Swagger API](/api/docs/) - All available API endpoints
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
index 356195c456..0ee9137901 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
@@ -59,13 +59,13 @@ You can use this specification with tools like:
## Endpoint Summary
-For a complete list of all API endpoints, see the interactive [Swagger API](/api/v2/docs).
+For a complete list of all API endpoints, see the interactive [Swagger API](/api/docs/).
For guidance on Swagger UI itself, see the [official Swagger documentation](https://swagger.io/tools/swagger-ui/).
## Related Pages
-- [Swagger API](/api/v2/docs) - All available API endpoints
+- [Swagger API](/api/docs/) - All available API endpoints
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Python wrapper for the API
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
index 7c310c65aa..285a11773c 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
@@ -131,6 +131,6 @@ Follow these practices to keep your tokens secure.
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Overview of authentication methods
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using tokens with the Python client
-- [Swagger API](/api/v2/docs) - All available API endpoints
+- [Swagger API](/api/docs/) - All available API endpoints
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
index 3c3e4bc033..1659b69ee3 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
@@ -167,6 +167,6 @@ Follow these practices to secure your webhook endpoints.
## Related Pages
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
-- [Swagger API](/api/v2/docs) - All available API endpoints
+- [Swagger API](/api/docs/) - All available API endpoints
export default ({ children }) => {children}
From 90767386bb8a28b66236e54eea5744ef6c361666 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Wed, 3 Jun 2026 10:35:17 +0000
Subject: [PATCH 15/23] More PR feedback
---
.../docs/getting-started/core-concepts.mdx | 4 +++-
.../creating-an-inference-service.mdx | 19 +++++++++++--------
2 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/frontend/pages/docs/getting-started/core-concepts.mdx b/frontend/pages/docs/getting-started/core-concepts.mdx
index ea32baaf1e..8c9cd41f98 100644
--- a/frontend/pages/docs/getting-started/core-concepts.mdx
+++ b/frontend/pages/docs/getting-started/core-concepts.mdx
@@ -116,13 +116,15 @@ Even for public models, downloading artefacts typically requires an approved acc
## Security Scanning
-Bailo automatically scans uploaded files and container images for security issues:
+Depending on configuration, Bailo automatically scans uploaded files and container images for security issues:
- **Files** are scanned by ClamAV (malware detection) and ModelScan (serialisation attack detection)
- **Container images** are scanned by Trivy (vulnerability detection with CVE reporting)
Scan results are displayed alongside each file and image, with severity ratings.
+Your Bailo administrator may change what scanners are enabled and used.
+
## Federation
Federation allows multiple Bailo instances to share models across organisational boundaries.
diff --git a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
index e6e4e87789..f27ee57f91 100644
--- a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
+++ b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
@@ -9,7 +9,7 @@ without downloading the model locally. This feature must be enabled by your admi
>
> - How do I deploy a model as an inference service?
> - What processor types are available for inference?
-> - How do I authenticate requests to an inference service?
+> - How are requests to an inference service authenticated?
## Prerequisites
@@ -55,21 +55,24 @@ Once created, the service is provisioned and accessible via an endpoint on the I
- View the service status on the model's **Inferencing** tab
- Access the service endpoint to make prediction requests
-- Generate a personal access token for authenticating inference requests
+- Use your existing Bailo access to authenticate to the service
## Authenticating Requests
-Use a Personal Access Token (PAT) to authenticate requests to the inference service endpoint.
+Authentication is handled automatically by the platform. Inference services sit behind an authentication proxy in the
+service mesh. When a request is made to an inference service, the proxy checks with Bailo to confirm that the user has
+the required access for the relevant model scope, similar to how container registry authentication works.
-To make authenticated requests to an inference service, you'll need a personal access token. See
-[Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) for instructions on creating
-one.
+You do not normally need to create or provide a Personal Access Token (PAT) for inference service requests. Access is
+tied to the permissions you already have in Bailo for the model. If you do not have the required model access, the
+request is denied.
+
+CORS is enabled on inference services so that Bailo can embed an externally hosted service interface in an `iframe`.
## Related Pages
- [Managing Inference Services](/docs/users/inferencing/managing-inference-services) - Updating and deleting services
- [Uploading Images](/docs/users/models/uploading-images) - How to push container images
-- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Authentication for
- inference
+- [Requesting Access](/docs/users/using-a-model/requesting-access) - How to request access to a model
export default ({ children }) => {children}
From f289d1af6d17a0f90eae30ad76bba47904604a2d Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Wed, 3 Jun 2026 12:03:19 +0000
Subject: [PATCH 16/23] Standardise system vs entry role usage in frontend
---
.../review-roles/managing-review-roles.mdx | 8 ++++----
.../pages/docs/getting-started/core-concepts.mdx | 6 +++++-
frontend/pages/docs/reference/glossary.mdx | 12 +++++++++---
.../docs/reference/roles-and-permissions.mdx | 16 ++++++++++------
frontend/pages/docs/users/models/model-card.mdx | 4 ++--
.../docs/users/reviews/understanding-reviews.mdx | 2 +-
frontend/src/entry/CreateEntry.tsx | 8 ++++++--
7 files changed, 37 insertions(+), 19 deletions(-)
diff --git a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
index 62a81b7685..e1217ca084 100644
--- a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
+++ b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
@@ -32,7 +32,7 @@ To create a new review role:
- **Short Name** - A brief identifier used internally. Example: "mtr".
- **Description** - What this role is responsible for reviewing. Example: "Reviews the technical quality and fitness
for purpose of models".
- - **System Role** - The minimum entry role a user must have to be assigned this review role. Options: Owner,
+ - **System Role** - The minimum system role a user must have to be assigned this review role. Options: Owner,
Contributor, Consumer, or none. Example: "Contributor".
- **Default collaborators** - Users or groups automatically assigned to this role when new models are created.
Example: "team-leads".
@@ -40,11 +40,11 @@ To create a new review role:
### Choosing a System Role
-The **System Role** field links a review role to an entry role. This means:
+The **System Role** field links a review role to an system role. This means:
- If set to **Contributor**, only users who are at least contributors on a model can be assigned this review role
- If set to **Owner**, only owners can be assigned
-- If left empty, any user can be assigned regardless of their entry role
+- If left empty, any user can be assigned regardless of their system role
### Default collaborators
@@ -116,7 +116,7 @@ For strict compliance requirements:
## Related Pages
- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works
-- [Roles & Permissions](/docs/reference/roles-and-permissions) - Entry roles vs review roles
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - System roles vs review roles
- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - How schemas and review roles connect
export default ({ children }) => {children}
diff --git a/frontend/pages/docs/getting-started/core-concepts.mdx b/frontend/pages/docs/getting-started/core-concepts.mdx
index 8c9cd41f98..6def1d09ac 100644
--- a/frontend/pages/docs/getting-started/core-concepts.mdx
+++ b/frontend/pages/docs/getting-started/core-concepts.mdx
@@ -87,7 +87,7 @@ access request process.
Bailo uses two complementary role systems to control access and governance.
-### Entry Roles
+### System Roles
These are assigned per-model and control what actions a user can take:
@@ -105,6 +105,10 @@ must be assigned to specific people who will review releases and access requests
For a full reference, see [Roles & Permissions](/docs/reference/roles-and-permissions).
+### Entry Roles
+
+The collective term for all system roles and review roles.
+
## Visibility
Model visibility controls who can discover and browse a model:
diff --git a/frontend/pages/docs/reference/glossary.mdx b/frontend/pages/docs/reference/glossary.mdx
index 04e6f354be..24c527cbba 100644
--- a/frontend/pages/docs/reference/glossary.mdx
+++ b/frontend/pages/docs/reference/glossary.mdx
@@ -24,13 +24,13 @@ configuration files, training data, and container images.
**Collaborator** - A user or group that has been granted a role (Owner, Contributor, or Consumer) on a specific model.
-**Consumer** - An entry role that allows a user to download files and pull container images from a model, provided they
+**Consumer** - A system role that allows a user to download files and pull container images from a model, provided they
have an approved access request or the model has ungoverned access enabled.
**Container image** (e.g. a Docker image) is a standalone, executable artefact used to create a container. This
container image contains all the libraries, dependencies, and files that the container needs to run.
-**Contributor** - An entry role that allows a user to edit the model card, upload files and images, and create releases
+**Contributor** - A system role that allows a user to edit the model card, upload files and images, and create releases
for a model.
**Data Card** - An entry type for documenting datasets. Data cards capture information about data provenance, storage,
@@ -39,6 +39,8 @@ and relationships to models.
**Entry** - The top-level entity in Bailo. Models, Data Cards, Mirrored Models, and Untrusted Models are all types of
entry.
+**Entry Role** - The collective term for all system roles and review roles.
+
**Federation** - A feature that connects multiple Bailo instances (or external sources like HuggingFace Hub), allowing
models from one to be browsed and mirrored in another.
@@ -67,7 +69,7 @@ technical quality of a model. This is a configurable review role, not a fixed sy
**ModelScan** - A security scanning tool used by Bailo to detect serialisation attacks in uploaded model files (e.g.
malicious pickle files).
-**Owner** - An entry role that grants full control over a model: editing, managing collaborators, creating releases, and
+**Owner** - A system role that grants full control over a model: editing, managing collaborators, creating releases, and
deleting the model.
**Peer** - Another Bailo instance or external model repository connected through federation.
@@ -100,6 +102,10 @@ versions indicate breaking changes, minor versions add functionality, and patch
**Soft Deletion** - Bailo's deletion model where deleted items are marked as removed but not immediately destroyed.
Administrators can recover soft-deleted items in exceptional circumstances.
+**System Role** - A system role (e.g. Owner, Contributor, Consumer) that is built into Bailo and determines what actions
+a user or group can perform on a model, such as editing metadata, uploading files, creating releases, or downloading
+artefacts.
+
**Trivy** - An open-source vulnerability scanner used by Bailo to scan container images for known security
vulnerabilities (CVEs).
diff --git a/frontend/pages/docs/reference/roles-and-permissions.mdx b/frontend/pages/docs/reference/roles-and-permissions.mdx
index c32653ecb2..5391058a8f 100644
--- a/frontend/pages/docs/reference/roles-and-permissions.mdx
+++ b/frontend/pages/docs/reference/roles-and-permissions.mdx
@@ -2,20 +2,20 @@ import DocsWrapper from 'src/docs/DocsWrapper'
# Roles and Permissions
-Bailo uses two complementary role systems: **Entry Roles** that control what actions a user can take on a model, and
+Bailo uses two complementary role systems: **System Roles** that control what actions a user can take on a model, and
**Review Roles** that determine who must approve releases and access requests.
> **Common questions this page answers:**
>
> - What can an Owner do in Bailo?
-> - What is the difference between entry roles and review roles?
+> - What is the difference between system roles and review roles?
> - Who can delete a model?
> - Who can upload files?
> - What is a Model Technical Reviewer (MTR)?
-## Entry Roles
+## System Roles
-Every collaborator on a model is assigned one of three entry roles that govern day-to-day interactions.
+Every collaborator on a model is assigned one of three system roles that govern day-to-day interactions.
### Owner
@@ -91,7 +91,7 @@ This reference lists every action in Bailo and which roles can perform it.
## Review Roles
-Review roles are created by administrators and attached to schemas. Unlike entry roles, review roles are not fixed -
+Review roles are created by administrators and attached to schemas. Unlike system roles, review roles are not fixed -
your organisation can define whatever roles make sense for your governance process.
### How Review Roles Work
@@ -118,7 +118,7 @@ Each review role has:
- **Name** - Display name (e.g. "Model Technical Reviewer")
- **Short Name** - Abbreviated identifier (e.g. "mtr")
- **Description** - Explanation of the role's purpose
-- **System Role** - The minimum entry role needed (owner, contributor, consumer, or none)
+- **System Role** - The minimum system role needed (owner, contributor, consumer, or none)
- **Default Entities** - Users or groups automatically assigned to this role on new models
### Who Can Review What?
@@ -128,6 +128,10 @@ Each review role has:
The exact review requirements depend on how your administrator has configured the schemas and review roles.
+## Entry Roles
+
+The collective term for all system roles and review roles.
+
## Assigning Roles
All roles on a model are managed from the model's Settings tab:
diff --git a/frontend/pages/docs/users/models/model-card.mdx b/frontend/pages/docs/users/models/model-card.mdx
index 7339599a84..674fea88df 100644
--- a/frontend/pages/docs/users/models/model-card.mdx
+++ b/frontend/pages/docs/users/models/model-card.mdx
@@ -50,11 +50,11 @@ After documenting your model, configure who can access the model and who will re
The screenshot above shows the model Settings tab with the Access section, where users and groups can be added as
-collaborators and assigned entry roles and review roles.
+collaborators and assigned system roles and review roles.
The selected roles will be notified when the model or its releases require review.
-### Entry Roles
+### System Roles
When adding collaborators, assign one of:
diff --git a/frontend/pages/docs/users/reviews/understanding-reviews.mdx b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
index 4624582023..b8732edfd2 100644
--- a/frontend/pages/docs/users/reviews/understanding-reviews.mdx
+++ b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
@@ -126,7 +126,7 @@ These tips help model owners prepare for smoother reviews.
- [Reviewing a Model Card Lifecycle Review](/docs/users/reviews/reviewing/model-lifecycle) - How to complete lifecycle
reviews
- [Review Outcomes](/docs/users/reviews/review-outcomes) - What happens after reviews are approved or changed
-- [Roles & Permissions](/docs/reference/roles-and-permissions) - Understanding review roles and entry roles
+- [Roles & Permissions](/docs/reference/roles-and-permissions) - Understanding review roles and system roles
- [Managing Review Roles](/docs/administration/review-roles/managing-review-roles) - Creating and configuring review
roles (administrators)
diff --git a/frontend/src/entry/CreateEntry.tsx b/frontend/src/entry/CreateEntry.tsx
index 21e45750ac..36e5f0136d 100644
--- a/frontend/src/entry/CreateEntry.tsx
+++ b/frontend/src/entry/CreateEntry.tsx
@@ -27,6 +27,7 @@ import EntryOrganisationInput from 'src/entry/EntryOrganisationInput'
import EntryAccessInput from 'src/entry/settings/EntryAccessInput'
import SourceModelInput from 'src/entry/SourceModelInput'
import ErrorWrapper from 'src/errors/ErrorWrapper'
+import Link from 'src/Link'
import MessageAlert from 'src/MessageAlert'
import TagSelector from 'src/MuiForms/TagSelector'
import {
@@ -263,8 +264,11 @@ export default function CreateEntry({ createEntryKind, onBackClick }: CreateEntr
Manage access list
- Please note that only entry roles can be added at this stage, and review roles should be added
- once a schema has been selected.
+ Please note that only{' '}
+
+ system roles
+ {' '}
+ can be added at this stage, and review roles should be added once a schema has been selected.
{isEntryRolesLoading ? (
From 964308d0472011ded4f972a242f1a762cb04fe06 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Mon, 8 Jun 2026 07:12:38 +0000
Subject: [PATCH 17/23] PR comments
---
frontend/pages/docs/getting-started/quick-start.mdx | 4 ++--
.../pages/docs/users/reviews/reviewing/model-lifecycle.mdx | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/frontend/pages/docs/getting-started/quick-start.mdx b/frontend/pages/docs/getting-started/quick-start.mdx
index 0812ec0dfc..8168fb199e 100644
--- a/frontend/pages/docs/getting-started/quick-start.mdx
+++ b/frontend/pages/docs/getting-started/quick-start.mdx
@@ -31,7 +31,7 @@ or scroll through the list.
Register a new model entry in Bailo by providing its name, description, and visibility settings:
-1. Click the **+ Create** button in the top navigation bar or in the Marketplace
+1. Click the **+** (Create) button in the top navigation bar or in the Marketplace
2. Select **Model** as the entry type
3. Next, provide the basic information about your model by filling in the required fields:
- **Model Name**: A clear, descriptive name for your model
@@ -84,7 +84,7 @@ If enabled, files are automatically scanned for security issues after upload.
## Step 6: Upload Container Images
If your model includes a containerised application (e.g. a Docker image for inference), you can push it to the Bailo
-registry so it can be included in releases::
+registry so it can be included in releases:
1. Go to the **Registry** tab on your model page
2. Click **Push image**
diff --git a/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx b/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx
index 09ae69c9be..eb116e594f 100644
--- a/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx
@@ -34,7 +34,7 @@ The model owner is responsible for checking the model card and confirming that i
## Setting a Lifecycle Review Date
-A lifecycle review is created by setting a review due date on the model card.
+A lifecycle review is created by setting a review due date on the model.
To set a lifecycle review date:
From 9e843cc71c46d66d25120d3b8edab980ff10fe0f Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Mon, 8 Jun 2026 07:23:53 +0000
Subject: [PATCH 18/23] Change subheadings to Sentence case
---
.../federation/peer-integration.mdx | 12 +++++-----
.../getting-started/app-configuration.mdx | 2 +-
.../deployment-architecture.mdx | 16 ++++++-------
.../helm/isolated-environments.mdx | 6 ++---
.../microservices/artefact-scanners.mdx | 2 +-
.../assigning-roles-to-schemas.mdx | 14 +++++------
.../review-roles/managing-review-roles.mdx | 16 ++++++-------
.../schemas/create-a-schema.mdx | 22 ++++++++---------
.../schemas/schema-migrations.mdx | 16 ++++++-------
.../schemas/understanding-schemas.mdx | 16 ++++++-------
.../docs/getting-started/core-concepts.mdx | 12 +++++-----
frontend/pages/docs/index.mdx | 4 ++--
.../docs/reference/roles-and-permissions.mdx | 20 ++++++++--------
.../pages/docs/reference/troubleshooting.mdx | 10 ++++----
.../users/data-cards/creating-a-data-card.mdx | 12 +++++-----
.../users/data-cards/managing-data-cards.mdx | 14 +++++------
.../creating-an-inference-service.mdx | 12 +++++-----
.../managing-inference-services.mdx | 10 ++++----
.../creating-a-mirrored-model.mdx | 2 +-
.../docs/users/models/creating-a-model.mdx | 12 +++++-----
.../docs/users/models/creating-a-release.mdx | 14 +++++------
.../pages/docs/users/models/model-card.mdx | 14 +++++------
.../docs/users/models/model-templating.mdx | 10 ++++----
.../docs/users/models/uploading-files.mdx | 8 +++----
.../docs/users/models/uploading-images.mdx | 6 ++---
.../authentication.mdx | 16 ++++++-------
.../programmatically-using-bailo/open-api.mdx | 10 ++++----
.../personal-access-tokens.mdx | 18 +++++++-------
.../python-client.mdx | 24 +++++++++----------
.../programmatically-using-bailo/webhooks.mdx | 18 +++++++-------
.../docs/users/reviews/review-outcomes.mdx | 24 +++++++++----------
.../docs/users/reviews/reviewing/access.mdx | 10 ++++----
.../reviews/reviewing/model-lifecycle.mdx | 16 ++++++-------
.../docs/users/reviews/reviewing/releases.mdx | 12 +++++-----
.../users/reviews/understanding-reviews.mdx | 22 ++++++++---------
.../untrusted-models/untrusted-models.mdx | 8 +++----
.../browsing-the-marketplace.mdx | 18 +++++++-------
.../users/using-a-model/downloading-files.mdx | 4 ++--
.../users/using-a-model/requesting-access.mdx | 2 +-
.../users/using-scanners/file-scanning.mdx | 4 ++--
.../users/using-scanners/image-scanning.mdx | 6 ++---
41 files changed, 247 insertions(+), 247 deletions(-)
diff --git a/frontend/pages/docs/administration/federation/peer-integration.mdx b/frontend/pages/docs/administration/federation/peer-integration.mdx
index eb14a62f08..83ecb0c754 100644
--- a/frontend/pages/docs/administration/federation/peer-integration.mdx
+++ b/frontend/pages/docs/administration/federation/peer-integration.mdx
@@ -11,7 +11,7 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Federation connects your Bailo instance to other Bailo instances or external model repositories, allowing users to
discover and mirror models from external sources.
-## Federation States
+## Federation states
Your Bailo instance can operate in one of three federation states, controlled by the administrator:
@@ -21,7 +21,7 @@ Your Bailo instance can operate in one of three federation states, controlled by
The federation state is configured by your administrator in the application configuration.
-## Peer Types
+## Peer types
Bailo supports connecting to different types of external model sources.
@@ -30,7 +30,7 @@ Bailo supports connecting to different types of external model sources.
Additional sources can be set up by your Bailo administrator.
-## Configuring Peers
+## Configuring peers
Peers are configured in the application's backend configuration. Each peer requires:
@@ -42,7 +42,7 @@ Peers are configured in the application's backend configuration. Each peer requi
Peer configuration is done through the app configuration file - see
[App Configuration](/docs/administration/getting-started/app-configuration).
-## How Federation Appears to Users
+## How federation appears to users
Users see external models alongside local models in the Marketplace, with filtering by external source.
@@ -53,7 +53,7 @@ When federation is enabled and peers are configured:
- Each external model shows its source
- External models can be clicked to view the source
-## Checking Peer Status
+## Checking peer status
Check the reachability of connected peers through the API.
@@ -61,7 +61,7 @@ You can check the status of connected peers [via the API](/api/docs//#/system).
Each peer has a reachability status indicating whether Bailo can communicate with it.
-## Related Pages
+## Related pages
- [App Configuration](/docs/administration/getting-started/app-configuration) - Where peers are configured
- [Creating a Mirrored Model](/docs/users/model-mirroring/creating-a-mirrored-model) - Mirroring external models
diff --git a/frontend/pages/docs/administration/getting-started/app-configuration.mdx b/frontend/pages/docs/administration/getting-started/app-configuration.mdx
index a94904f21f..6af5eadc95 100644
--- a/frontend/pages/docs/administration/getting-started/app-configuration.mdx
+++ b/frontend/pages/docs/administration/getting-started/app-configuration.mdx
@@ -9,7 +9,7 @@ import Alert from '@mui/material/Alert'
> - Where are the configuration files?
> - How does configuration inheritance work?
-## Configuration Files
+## Configuration files
If you use Helm this information does not apply to you.
diff --git a/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
index c96a743bd2..7ea1118e6a 100644
--- a/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
+++ b/frontend/pages/docs/administration/getting-started/deployment-architecture.mdx
@@ -12,7 +12,7 @@ import Alert from '@mui/material/Alert'
Bailo is composed of several services that work together. Understanding this architecture helps when configuring,
deploying, and troubleshooting a Bailo instance.
-## Core Services
+## Core services
Bailo requires six core services to operate.
@@ -24,7 +24,7 @@ Bailo requires six core services to operate.
Service.
- **Container Registry** (Docker Registry) - Hosts container (Docker) images pushed to models
-## Optional Services
+## Optional services
These services add security scanning, email notifications, and webhook testing capabilities.
@@ -34,7 +34,7 @@ These services add security scanning, email notifications, and webhook testing c
Mail Transfer Protocol.
- **Webhook** (Webhook Tester) - Development tool for receiving and inspecting webhook requests
-## How Requests Flow
+## How requests flow
All requests enter through the NGINX reverse proxy and are routed to the appropriate service.
@@ -49,11 +49,11 @@ All requests enter through the NGINX reverse proxy and are routed to the appropr
6. When files or images are uploaded, the **Backend** triggers scans via the **ClamD** and **ArtefactScan** service (if
configured)
-## Deployment Options
+## Deployment options
Bailo can be deployed using Docker Compose for development or Helm for production Kubernetes environments.
-### Docker Compose (Development & Small Deployments)
+### Docker compose (Development & Small Deployments)
The repository includes a `compose.yaml` that runs the core services locally. This is the simplest way to get started.
There is also ``compose.prod.yaml` to run all services locally. This is also used in the repository's GitHub workflows
@@ -67,7 +67,7 @@ For production deployments, Bailo provides Helm charts for deploying to Kubernet
- [Helm Configuration](/docs/administration/helm/configuration)
- [Isolated Environments](/docs/administration/helm/isolated-environments)
-### Standalone Dockerfile
+### Standalone dockerfile
`Dockerfile.standalone` is intended for local testing and secondary-instance scenarios. It should **not** be used as
@@ -109,7 +109,7 @@ The standalone instance is then available at `http://localhost:4318`.
If your Compose instance uses a different `INSTANCE_NAME`, replace `dev_internal` with the matching internal network
name, for example `_internal`.
-## Data Storage
+## Data storage
Bailo stores structured metadata in MongoDB and binary artefacts in S3-compatible object storage:
@@ -124,7 +124,7 @@ Bailo uses [node-config](https://github.com/node-config/node-config) for backend
be overridden via environment variables or Helm values. See
[App Configuration](/docs/administration/getting-started/app-configuration) for details.
-## Related Pages
+## Related pages
- [App Configuration](/docs/administration/getting-started/app-configuration) - Configuring the backend
- [Helm Basic Usage](/docs/administration/helm/basic-usage) - Deploying with Helm
diff --git a/frontend/pages/docs/administration/helm/isolated-environments.mdx b/frontend/pages/docs/administration/helm/isolated-environments.mdx
index c24f5159fe..3cf626b367 100644
--- a/frontend/pages/docs/administration/helm/isolated-environments.mdx
+++ b/frontend/pages/docs/administration/helm/isolated-environments.mdx
@@ -11,14 +11,14 @@ Bailo on a segregated environment you will need the following dependencies.
> - What dependencies does Bailo need for offline deployment?
> - How do I configure the Trivy database in an isolated environment?
-## Helm Charts
+## Helm charts
Bailo's Helm chart depends on [Bitnami charts](https://charts.bitnami.com/):
- MinIO https://charts.bitnami.com/bitnami
- MongoDB https://charts.bitnami.com/bitnami
-## Docker Images
+## Docker images
These container images must be available in your connected registry:
@@ -45,7 +45,7 @@ Bailo relies on many NPM (Node Package Manager) packages. The full list is avail
Instructions on installing `cypress` without internet are available
[here](https://docs.cypress.io/guides/references/advanced-installation).
-## Trivy Database
+## Trivy database
In isolated environments, Trivy may need custom configuration to access its vulnerability database.
diff --git a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
index 34453078ae..782130bd02 100644
--- a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
+++ b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
@@ -70,7 +70,7 @@ Trivy is used to analyse container image layers for known vulnerabilities and to
> Trivy is an open-source vulnerability scanner from Aqua Security for containers and other artefacts.
-## Minimal Configuration
+## Minimal configuration
Configure scanner settings in the backend application configuration. These settings will apply to all scanners.
diff --git a/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx b/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
index 02dafa2c6d..3e5ca40cb8 100644
--- a/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
+++ b/frontend/pages/docs/administration/review-roles/assigning-roles-to-schemas.mdx
@@ -11,7 +11,7 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Review roles and schemas work together to define your governance process. When you attach review roles to a schema,
every model that uses that schema will require those roles to approve releases and access requests.
-## How the Connection Works
+## How the connection works
Review roles are attached to schemas, and models inherit role requirements when they select a schema.
@@ -25,7 +25,7 @@ Review Role ──attached to──> Schema ──selected by──> Model
3. When a model owner selects that schema, the model inherits the review role requirements
4. The model owner then assigns specific people to each review role on their model
-## Attaching Roles During Schema Creation
+## Attaching roles during schema creation
Select review roles during schema creation from the Default Review Roles section:
@@ -35,7 +35,7 @@ Select review roles during schema creation from the Default Review Roles section
4. In the **Default Review Roles** section, select which roles this schema requires
5. Upload the schema
-## Attaching Roles to an Existing Schema
+## Attaching roles to an existing schema
Modify review role requirements on existing schemas from the schema's Actions menu:
@@ -45,7 +45,7 @@ Modify review role requirements on existing schemas from the schema's Actions me
4. Make your selection
5. **Save** your changes
-## What Happens When You Change Role Assignments
+## What happens when you change role assignments
Changes to role assignments on a schema affect both existing and new models using that schema:
@@ -53,7 +53,7 @@ Changes to role assignments on a schema affect both existing and new models usin
- **New models** created with the schema will inherit the current role requirements
- Model owners may need to assign people to any newly added roles
-## Best Practices
+## Best practices
Plan role assignments before creating schemas and use consistent roles across related schemas.
@@ -64,7 +64,7 @@ Plan role assignments before creating schemas and use consistent roles across re
- **Document role expectations** - Use the review role description field to clearly explain what each reviewer should
check
-## Example Configuration
+## Example configuration
A typical governance setup:
@@ -79,7 +79,7 @@ This means:
- Every release requires both technical and governance approval
- Access requests only need governance approval
-## Related Pages
+## Related pages
- [Managing Review Roles](/docs/administration/review-roles/managing-review-roles) - Creating and editing roles
- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - How schemas work
diff --git a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
index e1217ca084..117cfc2434 100644
--- a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
+++ b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
@@ -13,7 +13,7 @@ you can create, edit, and delete review roles to match your governance requireme
Only administrators will have the following options available to them.
-## Viewing Existing Roles
+## Viewing existing roles
View all configured review roles from the Review Roles navigation item.
@@ -21,7 +21,7 @@ To see all review roles configured in your Bailo instance, select **Review Roles
This page lists all review roles with their name, short name, description, and associated system role.
-## Creating a Review Role
+## Creating a review role
To create a new review role:
@@ -38,7 +38,7 @@ To create a new review role:
Example: "team-leads".
4. Click **Submit**
-### Choosing a System Role
+### Choosing a system role
The **System Role** field links a review role to an system role. This means:
@@ -51,7 +51,7 @@ The **System Role** field links a review role to an system role. This means:
Default collaborators are pre-populated when a model owner sets up review roles on their model. This is useful for roles
that should always be assigned to the same team or person across all models.
-## Editing a Review Role
+## Editing a review role
To edit an existing role:
@@ -63,7 +63,7 @@ To edit an existing role:
Changes to review roles apply to all schemas that use the role and all models that use those schemas.
-## Deleting a Review Role
+## Deleting a review role
Deleting a review role removes it from all schemas that reference it:
@@ -75,7 +75,7 @@ Deleting a review role removes it from all schemas that reference it:
> **Warning**: Deleting a review role removes it from all schemas that reference it. Models using those schemas will no
> longer require approval from that role. Make sure this is intended before deleting.
-## Connecting Roles to Schemas
+## Connecting roles to schemas
After creating review roles, attach them to schemas so that models using those schemas require the roles:
@@ -87,7 +87,7 @@ After creating review roles, attach them to schemas so that models using those s
Every model that uses this schema will then require all attached review roles to approve releases before they are
finalised.
-## Common Configurations
+## Common configurations
These examples show typical governance setups using review roles.
@@ -113,7 +113,7 @@ For strict compliance requirements:
- Create a role with **Default Entities** set to your compliance team
- This ensures the same team always reviews every model
-## Related Pages
+## Related pages
- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works
- [Roles & Permissions](/docs/reference/roles-and-permissions) - System roles vs review roles
diff --git a/frontend/pages/docs/administration/schemas/create-a-schema.mdx b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
index 15cc337573..645e32ab32 100644
--- a/frontend/pages/docs/administration/schemas/create-a-schema.mdx
+++ b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
@@ -16,7 +16,7 @@ non-technical overview.
> - How do I add conditional fields to a schema?
> - How do I test a schema?
-## Before You Start
+## Before you start
Bailo includes example schemas in `backend/src/scripts/example_schemas`. These contain all mandatory fields the
application needs to run. Use them as a starting point for your own schemas.
@@ -24,7 +24,7 @@ application needs to run. Use them as a starting point for your own schemas.
> **Important**: Some fields are required by the application and are referenced in the source code. Always start from an
> example schema rather than building from scratch.
-## Schema Structure
+## Schema structure
A schema is a JSON object with a `properties` field containing pages, sections, and questions.
@@ -90,11 +90,11 @@ Within each page, you can create sub-sections using nested objects:
}
```
-## Question Types
+## Question types
Schemas support several question types including text, dates, booleans, and dropdowns.
-### Simple Text Questions
+### Simple text questions
```json
"firstName": {
@@ -122,7 +122,7 @@ If you omit the `title` property, the library uses the property name (e.g. `firs
}
```
-### Boolean Questions
+### Boolean questions
```json
"isPublic": {
@@ -131,7 +131,7 @@ If you omit the `title` property, the library uses the property name (e.g. `firs
}
```
-### Dropdown Selections
+### Dropdown selections
```json
"category": {
@@ -141,7 +141,7 @@ If you omit the `title` property, the library uses the property name (e.g. `firs
}
```
-## Hiding Sections from the Model Card
+## Hiding sections from the model card
By default, all sections are displayed on the model card page. To hide a section from the model card view while still
collecting the data in the form:
@@ -217,7 +217,7 @@ To avoid validation errors, Bailo schemas handle dependencies differently from t
}
```
-### Why This Pattern?
+### Why this pattern?
The standard RJSF dependency approach can cause validation errors when users change their answers. The issue is:
@@ -230,7 +230,7 @@ Our approach sets additional questions to **read-only** instead of hiding them e
they change their mind, while avoiding schema validation failures. The trade-off is that some unused data may persist,
but it can be cleared by the user if needed.
-## Testing Your Schema
+## Testing your schema
Always test a schema by uploading it, creating a test model, and working through every form page.
@@ -246,7 +246,7 @@ Before deploying a schema to production:
- Section titles and descriptions are clear
5. Check the model card view to confirm the right sections are displayed
-## Complete Example
+## Complete example
A minimal but complete schema with two pages, required fields, and basic structure:
@@ -295,7 +295,7 @@ A minimal but complete schema with two pages, required fields, and basic structu
}
```
-## Related Pages
+## Related pages
- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - Non-technical overview
- [Uploading a Schema](/docs/administration/schemas/upload-a-schema) - How to upload your schema to Bailo
diff --git a/frontend/pages/docs/administration/schemas/schema-migrations.mdx b/frontend/pages/docs/administration/schemas/schema-migrations.mdx
index c2089c65f1..14a4ba5f87 100644
--- a/frontend/pages/docs/administration/schemas/schema-migrations.mdx
+++ b/frontend/pages/docs/administration/schemas/schema-migrations.mdx
@@ -14,7 +14,7 @@ Only administrators will have the following options available to them.
> - What is a schema migration plan?
> - What is the difference between draft and final migrations?
-## When to Use Schema Migrations
+## When to use schema migrations
Use migrations when you've updated a schema and need to transform existing model card data to match.
@@ -24,7 +24,7 @@ Common scenarios:
- You're reorganising the section structure of a schema
- You're retiring an old schema and moving models to a newer version
-## How Migrations Work
+## How migrations work
A migration plan maps each question from a source schema to either a new location in the target schema or marks it for
deletion. For each question in the source, you specify one of two actions:
@@ -45,7 +45,7 @@ Compare two schemas side by side to identify differences before planning a migra
- **Source Schema**: The schema you are migrating from
- **Target Schema**: The schema you are migrating to
-## Creating a Migration Plan
+## Creating a migration plan
Create a migration plan from the Schemas navigation item by mapping source questions to target locations.
@@ -65,14 +65,14 @@ Create a migration plan from the Schemas navigation item by mapping source quest
8. Once all questions have been mapped, verify the intended actions under **View Actions**.
9. Save as **Draft** (for testing) or **Final** (ready to use)
-### Draft vs Final
+### Draft vs final
- **Draft** migrations can be edited and tested but cannot be applied to models
- **Final** migrations are locked and can be applied to models
It is recommended to save as a draft first, verify the mappings are correct, and then mark as final when ready.
-## Applying a Migration
+## Applying a migration
Once finalised, a migration plan can be applied to individual models that use the source schema:
@@ -84,7 +84,7 @@ Once finalised, a migration plan can be applied to individual models that use th
> **Note**: Applying a migration creates a new model card version. The previous version is preserved in the model's
> history, so you can always see what the data looked like before the migration.
-## Best Practices
+## Best practices
Test migrations as drafts, migrate incrementally, and communicate changes to model owners.
@@ -94,7 +94,7 @@ Test migrations as drafts, migrate incrementally, and communicate changes to mod
fields that don't have mappings from the old schema
- **Check after migration**: Verify that the migrated data appears correctly in the model card form
-## Viewing Existing Migrations
+## Viewing existing migrations
View all migration plans and their status from the Schemas navigation item:
@@ -102,7 +102,7 @@ View all migration plans and their status from the Schemas navigation item:
2. Select **Migrations**
3. The list shows all migrations with their name, source schema, target schema, and draft/final status
-## Related Pages
+## Related pages
- [Understanding Schemas](/docs/administration/schemas/understanding-schemas) - What schemas are and how they work
- [Creating a Schema](/docs/administration/schemas/create-a-schema) - How to author a new schema
diff --git a/frontend/pages/docs/administration/schemas/understanding-schemas.mdx b/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
index d2629d8ba7..cc62b8a1bd 100644
--- a/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
+++ b/frontend/pages/docs/administration/schemas/understanding-schemas.mdx
@@ -15,7 +15,7 @@ access request forms, ensuring that every model in your organisation is document
This page explains what schemas are and how they work. For step-by-step instructions on creating a schema, see
[Creating a Schema](/docs/administration/schemas/create-a-schema).
-## What is a Schema?
+## What is a schema?
A schema is a template that defines the questions, structure, and validation rules for model card and access request
forms:
@@ -28,7 +28,7 @@ forms:
When a user creates a model or submits an access request, they select a schema. That schema then generates the form they
fill in.
-## Schema Types
+## Schema types
Bailo supports three types of schema, each serving a different purpose:
@@ -39,7 +39,7 @@ Bailo supports three types of schema, each serving a different purpose:
- **Access Request** - Defines the form users fill in when requesting access to a model: who is requesting, why, what
permissions they need, etc.
-## How Schemas Relate to Other Concepts
+## How schemas relate to other concepts
Schemas connect to models, review roles, and forms in a structured relationship.
@@ -55,7 +55,7 @@ Data Card ──selects──> Schema (at setup time)
When an administrator attaches review roles to a schema, every model that uses that schema will require those roles to
be assigned and to approve releases and access requests.
-## Active vs Inactive Schemas
+## Active vs inactive schemas
Schemas can be toggled between active and inactive states without breaking existing models:
@@ -64,7 +64,7 @@ Schemas can be toggled between active and inactive states without breaking exist
This allows you to retire old schemas without breaking existing models.
-## Why Schemas Matter
+## Why schemas matter
Without schemas, every model would be documented differently, making it difficult to:
@@ -76,7 +76,7 @@ Without schemas, every model would be documented differently, making it difficul
Schemas give administrators control over what information is captured, while giving model owners a clear and structured
form to fill in.
-## Schema Versioning and Migrations
+## Schema versioning and migrations
Schema migrations allow model card data to be transformed when schemas are updated.
@@ -86,7 +86,7 @@ version to another.
See [Schema Migrations](/docs/administration/schemas/schema-migrations) for details.
-## Technical Details
+## Technical details
Schemas are built using JSON Schema and rendered using RJSF (React JSON Schema Form). This means schemas support:
@@ -99,7 +99,7 @@ Schemas are built using JSON Schema and rendered using RJSF (React JSON Schema F
For technical instructions on writing schema JSON, see
[Creating a Schema](/docs/administration/schemas/create-a-schema).
-## Related Pages
+## Related pages
- [Creating a Schema](/docs/administration/schemas/create-a-schema) - Step-by-step schema authoring guide
- [Uploading a Schema](/docs/administration/schemas/upload-a-schema) - How to upload a schema to Bailo
diff --git a/frontend/pages/docs/getting-started/core-concepts.mdx b/frontend/pages/docs/getting-started/core-concepts.mdx
index 6def1d09ac..38b609b14a 100644
--- a/frontend/pages/docs/getting-started/core-concepts.mdx
+++ b/frontend/pages/docs/getting-started/core-concepts.mdx
@@ -12,7 +12,7 @@ help you navigate the platform and make the most of its features.
> - What roles exist in Bailo?
> - How does the review process work?
-## Entry Types
+## Entry types
Bailo organises content into four entry types, each serving a different purpose:
@@ -24,7 +24,7 @@ Bailo organises content into four entry types, each serving a different purpose:
Some Entry types must be enabled by your Bailo administrator before they can be used.
-## The Lifecycle of a Model
+## The lifecycle of a model
A model follows a structured lifecycle from creation through review to consumer access:
@@ -83,7 +83,7 @@ through its own review process. Once approved, the user gains the permissions sp
Some models may have **ungoverned access** enabled, which allows any user to download files without going through the
access request process.
-## Roles and Permissions
+## Roles and permissions
Bailo uses two complementary role systems to control access and governance.
@@ -95,7 +95,7 @@ These are assigned per-model and control what actions a user can take:
- **Contributor** - Edit the model card, upload files and images, create releases
- **Consumer** - Download files and pull images (requires an approved access request, unless ungoverned access is on)
-### Review Roles
+### Review roles
These are created by administrators and attached to schemas. When a model uses a schema with review roles, those roles
must be assigned to specific people who will review releases and access requests. Common examples include:
@@ -105,7 +105,7 @@ must be assigned to specific people who will review releases and access requests
For a full reference, see [Roles & Permissions](/docs/reference/roles-and-permissions).
-### Entry Roles
+### Entry roles
The collective term for all system roles and review roles.
@@ -118,7 +118,7 @@ Model visibility controls who can discover and browse a model:
Even for public models, downloading artefacts typically requires an approved access request.
-## Security Scanning
+## Security scanning
Depending on configuration, Bailo automatically scans uploaded files and container images for security issues:
diff --git a/frontend/pages/docs/index.mdx b/frontend/pages/docs/index.mdx
index fca0869807..1f676a30d3 100644
--- a/frontend/pages/docs/index.mdx
+++ b/frontend/pages/docs/index.mdx
@@ -20,7 +20,7 @@ The service aims to:
- Enforce consistent compliance and review processes
- Support monitoring and governance of operational models
-## Where to Start
+## Where to start
Pick the entry point that best matches your role or goal.
@@ -33,7 +33,7 @@ Pick the entry point that best matches your role or goal.
- **An administrator**: [App Configuration](/docs/administration/getting-started/app-configuration) - Setting up and
configuring Bailo
-## Documentation Sections
+## Documentation sections
The documentation is split into four sections covering onboarding, day-to-day usage, platform administration, and
reference material.
diff --git a/frontend/pages/docs/reference/roles-and-permissions.mdx b/frontend/pages/docs/reference/roles-and-permissions.mdx
index 5391058a8f..2e33261622 100644
--- a/frontend/pages/docs/reference/roles-and-permissions.mdx
+++ b/frontend/pages/docs/reference/roles-and-permissions.mdx
@@ -13,7 +13,7 @@ Bailo uses two complementary role systems: **System Roles** that control what ac
> - Who can upload files?
> - What is a Model Technical Reviewer (MTR)?
-## System Roles
+## System roles
Every collaborator on a model is assigned one of three system roles that govern day-to-day interactions.
@@ -68,7 +68,7 @@ Consumers cannot:
- Upload files or images
- Create releases
-## Permission Summary
+## Permission summary
This reference lists every action in Bailo and which roles can perform it.
@@ -89,12 +89,12 @@ This reference lists every action in Bailo and which roles can perform it.
- **Create access requests** - Owner: Yes, Contributor: Yes, Consumer: Yes, Public (no role): No
- **Delete model** - Owner: Yes, Contributor: No, Consumer: No, Public (no role): No
-## Review Roles
+## Review roles
Review roles are created by administrators and attached to schemas. Unlike system roles, review roles are not fixed -
your organisation can define whatever roles make sense for your governance process.
-### How Review Roles Work
+### How review roles work
1. An administrator creates review roles (e.g. "Model Technical Reviewer", "Model Senior Responsible Officer")
2. The administrator attaches these roles to a schema
@@ -102,7 +102,7 @@ your organisation can define whatever roles make sense for your governance proce
4. When a release or access request is created, the assigned reviewers are notified
5. Each review role must approve before the submission is considered fully approved
-### Common Review Roles
+### Common review roles
While organisations can create any review roles they need, two are commonly used:
@@ -111,7 +111,7 @@ While organisations can create any review roles they need, two are commonly used
- **Model Senior Responsible Officer (MSRO)**: Reviews governance and compliance aspects - data handling, ethical
considerations, risk assessment, and organisational policies
-### Review Role Properties
+### Review role properties
Each review role has:
@@ -121,18 +121,18 @@ Each review role has:
- **System Role** - The minimum system role needed (owner, contributor, consumer, or none)
- **Default Entities** - Users or groups automatically assigned to this role on new models
-### Who Can Review What?
+### Who can review what?
- **Release reviews** can be performed by any assigned review role
- **Access request reviews** are typically restricted to specific review roles (commonly MSRO)
The exact review requirements depend on how your administrator has configured the schemas and review roles.
-## Entry Roles
+## Entry roles
The collective term for all system roles and review roles.
-## Assigning Roles
+## Assigning roles
All roles on a model are managed from the model's Settings tab:
@@ -142,7 +142,7 @@ All roles on a model are managed from the model's Settings tab:
4. Select the appropriate role(s)
5. **Save** changes
-## Related Pages
+## Related pages
- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works
- [Managing Review Roles](/docs/administration/review-roles/managing-review-roles) - Creating and configuring review
diff --git a/frontend/pages/docs/reference/troubleshooting.mdx b/frontend/pages/docs/reference/troubleshooting.mdx
index a26c73cd96..6a8707dfcd 100644
--- a/frontend/pages/docs/reference/troubleshooting.mdx
+++ b/frontend/pages/docs/reference/troubleshooting.mdx
@@ -11,7 +11,7 @@ import DocsWrapper from 'src/docs/DocsWrapper'
Common issues and answers for Bailo users and administrators.
-## Models and the Marketplace
+## Models and the marketplace
Common issues with finding, editing, and deleting models.
@@ -47,7 +47,7 @@ Common issues with creating releases and the review process.
- Only **Owners** and **Contributors** can create releases.
- Make sure you have filled in the required fields: version (semver format), and release notes.
-## Access Requests
+## Access requests
Common issues with access request approval and file downloads.
@@ -99,7 +99,7 @@ Secret keys are only shown once when the token is created. If you've lost it, de
- Check that the token is **scoped to the correct model** (or set to "All models").
- Verify you're using the correct access key and secret key pair.
-## Schemas and Forms
+## Schemas and forms
Common issues with schema validation and form fields.
@@ -114,7 +114,7 @@ Common issues with schema validation and form fields.
- Only **active** schemas appear in the selection list. An administrator may have deactivated the schema.
- Contact your administrator if you need a specific schema.
-## Security Scanning
+## Security scanning
Common issues with file and container image scan results.
@@ -140,7 +140,7 @@ Common administration questions.
Check the **Help** page in Bailo for support links and contact information specific to your deployment.
-## Related Pages
+## Related pages
- [Quick Start Guide](/docs/getting-started/quick-start) - Getting started with Bailo
- [Roles & Permissions](/docs/reference/roles-and-permissions) - Understanding what each role allows
diff --git a/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx b/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
index a143c4158f..5b8643ed44 100644
--- a/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
+++ b/frontend/pages/docs/users/data-cards/creating-a-data-card.mdx
@@ -12,7 +12,7 @@ should be handled.
> - When should I use a data card instead of a model?
> - How do I document a dataset?
-## When to Use a Data Card
+## When to use a data card
Create a data card when you want to:
@@ -22,7 +22,7 @@ Create a data card when you want to:
- Link datasets to the models that use them
- Meet compliance or governance requirements around data handling
-## Creating a Data Card
+## Creating a data card
Create a data card from the navigation bar by selecting the Data Card entry type:
@@ -34,7 +34,7 @@ Create a data card from the navigation bar by selecting the Data Card entry type
- **Access control**: Choose **Public** (visible to all users) or **Private** (visible only to collaborators)
4. Once you have filled in these details, click **Create data card**
-## Selecting a Schema
+## Selecting a schema
After creating the data card, you'll be prompted to select a **schema**. The schema defines what information you need to
provide about your dataset. Your administrator will have set up schemas appropriate for your organisation.
@@ -48,7 +48,7 @@ Common fields in a data card schema might include:
- Retention period
- Known limitations or biases
-## Filling In the Data Card
+## Filling in the data card
Work through the form sections to document your dataset, then save to create a versioned record.
@@ -58,7 +58,7 @@ providing as much detail as you can. The form is divided into tabs based on the
Click **Save** once you are happy with the form. This creates a new data card version which is automatically shown to
anyone viewing the data card.
-## Using the Python Client
+## Using the Python client
You can also create and manage data cards programmatically using the Bailo Python client:
@@ -80,7 +80,7 @@ data_card.update_data_card(metadata={"overview": {"tags": ["image", "classificat
A full example is available in the [Data Cards demo notebook](/docs/python/notebooks/datacards_demo/index.html).
-## Related Pages
+## Related pages
- [Managing Data Cards](/docs/users/data-cards/managing-data-cards) - Editing, versioning, and linking data cards
- [Core Concepts](/docs/getting-started/core-concepts) - How data cards fit into the Bailo data model
diff --git a/frontend/pages/docs/users/data-cards/managing-data-cards.mdx b/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
index 5cd93c0a02..bb5d744fc3 100644
--- a/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
+++ b/frontend/pages/docs/users/data-cards/managing-data-cards.mdx
@@ -12,7 +12,7 @@ to models.
> - Can I change the schema on a data card?
> - How do I link a data card to a model?
-## Editing a Data Card
+## Editing a data card
Edit a data card by navigating to it and using the Edit data card button:
@@ -21,7 +21,7 @@ Edit a data card by navigating to it and using the Edit data card button:
3. Click **Edit data card** and edit any section of the data card form
4. Click **Save** to create a new version
-## Viewing Version History
+## Viewing version history
Every edit creates a new version, and you can view the full history to track changes over time:
@@ -31,7 +31,7 @@ Every edit creates a new version, and you can view the full history to track cha
This is useful for tracking how documentation has evolved and understanding what changed between versions.
-## Managing Collaborators
+## Managing collaborators
Add users or groups as collaborators with specific roles to control access to the data card:
@@ -42,7 +42,7 @@ Add users or groups as collaborators with specific roles to control access to th
- **Contributor**: Can edit the data card content
- **Consumer**: Can view the data card
-## Changing the Schema
+## Changing the schema
Schema changes are managed through administrator-created migration plans rather than direct switching.
@@ -51,12 +51,12 @@ published by the Bailo administrators (for example, if your organisation has upd
See [Schema Migrations](/docs/administration/schemas/schema-migrations) for further details. Note that changing schemas
may require you to re-enter some information if the new schema has different fields.
-## Linking Data Cards to Models
+## Linking data cards to models
Data cards and models can reference each other to maintain traceability between datasets and the models trained on them.
When filling in a model card, look for fields that allow you to reference related data cards.
-## Using the Python Client
+## Using the Python client
Use the Bailo Python client to retrieve and update data cards programmatically:
@@ -75,7 +75,7 @@ data_card.update_data_card(metadata={"overview": {"tags": ["updated"]}})
card = data_card.data_card
```
-## Related Pages
+## Related pages
- [Creating a Data Card](/docs/users/data-cards/creating-a-data-card) - How to create a new data card
- [Roles & Permissions](/docs/reference/roles-and-permissions) - What each role allows
diff --git a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
index f27ee57f91..9adff20f86 100644
--- a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
+++ b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
@@ -19,7 +19,7 @@ Before creating an inference service, you need:
[Uploading Images](/docs/users/models/uploading-images))
- Appropriate permissions on the model (Owner or Contributor)
-## Creating a Service
+## Creating a service
Create an inference service from the Inferencing tab on your model page.
@@ -34,13 +34,13 @@ Create an inference service from the Inferencing tab on your model page.
- **Memory**: Memory allocation in GB (1-8 GB, shown for CPU only). Required for CPU.
5. Once all fields are filled in, click **Create Inferencing Service**
-### Choosing a Processor Type
+### Choosing a processor type
- **CPU**: Available on all deployments. You'll need to specify memory allocation (1-8 GB).
- **GPU**: Available GPU types depend on your deployment's configuration. GPU options are configured by your
administrator.
-### Choosing a Port
+### Choosing a port
The port should match the port your model's container exposes for serving predictions. Common ports include:
@@ -49,7 +49,7 @@ The port should match the port your model's container exposes for serving predic
Check your model's container configuration if you're unsure which port to use.
-## After Creation
+## After creation
Once created, the service is provisioned and accessible via an endpoint on the Inferencing tab. You can:
@@ -57,7 +57,7 @@ Once created, the service is provisioned and accessible via an endpoint on the I
- Access the service endpoint to make prediction requests
- Use your existing Bailo access to authenticate to the service
-## Authenticating Requests
+## Authenticating requests
Authentication is handled automatically by the platform. Inference services sit behind an authentication proxy in the
service mesh. When a request is made to an inference service, the proxy checks with Bailo to confirm that the user has
@@ -69,7 +69,7 @@ request is denied.
CORS is enabled on inference services so that Bailo can embed an externally hosted service interface in an `iframe`.
-## Related Pages
+## Related pages
- [Managing Inference Services](/docs/users/inferencing/managing-inference-services) - Updating and deleting services
- [Uploading Images](/docs/users/models/uploading-images) - How to push container images
diff --git a/frontend/pages/docs/users/inferencing/managing-inference-services.mdx b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
index 955b07a28e..6d780a24e2 100644
--- a/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
+++ b/frontend/pages/docs/users/inferencing/managing-inference-services.mdx
@@ -10,7 +10,7 @@ Once an inference service has been created, you can view its details, update its
> - How do I update an inference service?
> - Can I change the container image on an inference service?
-## Viewing Inference Services
+## Viewing inference services
View all active inference services for a model from the Inferencing tab:
@@ -18,7 +18,7 @@ View all active inference services for a model from the Inferencing tab:
2. Navigate to the **Inferencing** tab - this is where all services are managed
3. All active inference services are listed with their image, description, and status
-## Updating a Service
+## Updating a service
Update an inference service's configuration from the service's settings panel:
@@ -35,7 +35,7 @@ Update an inference service's configuration from the service's settings panel:
> **Note**: You cannot change the container image of an existing inference service. To use a different image, delete the
> current service and create a new one.
-## Deleting a Service
+## Deleting a service
Deleting an inference service can only be done via the API:
@@ -45,11 +45,11 @@ DELETE /api/v2/model/{modelId}/inference/{image}/{tag}
Deleting a service stops it and removes the deployment. This action cannot be undone.
-## Programmatic Access
+## Programmatic access
Inference services can also be managed [via the API](/api/docs//#/inference).
-## Related Pages
+## Related pages
- [Creating an Inference Service](/docs/users/inferencing/creating-an-inference-service) - Setting up a new service
- [OpenAPI Reference](/docs/users/programmatically-using-bailo/open-api) - Full API documentation
diff --git a/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx b/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx
index 41b03c5411..3574c60ab2 100644
--- a/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx
+++ b/frontend/pages/docs/users/model-mirroring/creating-a-mirrored-model.mdx
@@ -27,7 +27,7 @@ The mirrored model uses the source model as the single source of truth. Core mod
cannot be edited locally. This ensures consistency while still allowing controlled reuse of model metadata. You may
optionally add additional local context to a mirrored model without modifying the source model.
-## How to create a Mirrored Model
+## How to create a mirrored model
Create a mirrored model from the model creation page if mirroring is enabled for your Bailo instance:
diff --git a/frontend/pages/docs/users/models/creating-a-model.mdx b/frontend/pages/docs/users/models/creating-a-model.mdx
index df49e35e73..d94492b703 100644
--- a/frontend/pages/docs/users/models/creating-a-model.mdx
+++ b/frontend/pages/docs/users/models/creating-a-model.mdx
@@ -14,7 +14,7 @@ filling in the model card.
> - What entry types are available?
> - How do I choose between public and private visibility?
-## Choosing an Entry Type
+## Choosing an entry type
Bailo supports four entry types. Select the one that matches your use case.
@@ -29,7 +29,7 @@ Click the **+ Create** button in the navigation bar. You'll see the available en
Select **Model** to create a standard model.
-## Basic Details
+## Basic details
Every model requires a name, description, and visibility setting:
@@ -46,7 +46,7 @@ configured in the model settings.
The screenshot above shows the marketplace with the model creation button.
-## Selecting a Schema
+## Selecting a schema
The schema determines the structure of your model card - the questions you will answer about your model.
@@ -63,7 +63,7 @@ The model card captures important information such as:
- Performance metrics
- Known limitations or biases
-## Next Steps
+## Next steps
After creating a model and selecting a schema:
@@ -71,7 +71,7 @@ After creating a model and selecting a schema:
2. [Upload files](/docs/users/models/uploading-files) - add model artefacts
3. [Create a release](/docs/users/models/creating-a-release) - version your model for distribution
-## Changing the Model Name or Description
+## Changing the model name or description
To update the model name or description after creation:
@@ -79,7 +79,7 @@ To update the model name or description after creation:
2. Navigate to **Settings**
3. Edit the **Name** and/or **Description** fields
-## Related Pages
+## Related pages
- [Model Card](/docs/users/models/model-card) - Filling in the model card and configuring access
- [Core Concepts](/docs/getting-started/core-concepts) - Understanding the Bailo data model
diff --git a/frontend/pages/docs/users/models/creating-a-release.mdx b/frontend/pages/docs/users/models/creating-a-release.mdx
index 9153cb2b8e..eab6297b5d 100644
--- a/frontend/pages/docs/users/models/creating-a-release.mdx
+++ b/frontend/pages/docs/users/models/creating-a-release.mdx
@@ -16,7 +16,7 @@ and a reference to a specific model card version. Creating a release triggers th
> - What is a minor release?
> - What happens after I create a release?
-## What is a Release?
+## What is a release?
Releases use [semantic versioning](https://semver.org/) (e.g. `1.0.0`, `1.1.0`, `2.0.0`) to track changes to a model
over time:
@@ -25,7 +25,7 @@ over time:
- **Minor** version (second number): new features or improvements
- **Patch** version (third number): bug fixes or small updates
-## Creating a Release
+## Creating a release
You create a release from the Releases tab on your model page by filling in a version number, release notes, and
attaching files or images:
@@ -54,12 +54,12 @@ and container image attachments.
4. Once you have filled in the release details and attached any artefacts, click **Create Release** to submit
-## Draft vs Published Releases
+## Draft vs published releases
Releases are initially created as **drafts**. Draft releases can be edited before they are finalised. Once all required
reviews are approved, the release is considered published.
-## Minor Releases
+## Minor releases
You can mark a release as a **minor release** to bypass the review workflow. This is intended for small, low-risk
updates that do not materially change the behaviour or purpose of the model.
@@ -81,7 +81,7 @@ Key points:
If a change could affect model performance, outputs, safety, or intended use, you should create a **standard release**
so that it goes through the full review process.
-## What Happens After Creation
+## What happens after creation
Creating a release triggers the review process, notifying all assigned reviewers:
@@ -90,7 +90,7 @@ Creating a release triggers the review process, notifying all assigned reviewers
3. Once all required roles approve, the release is finalised
4. If any reviewer requests changes, you'll be notified to update the release
-## Editing a Release
+## Editing a release
You can update a release's notes, files, and images after creation:
@@ -100,7 +100,7 @@ You can update a release's notes, files, and images after creation:
4. Update the release notes, files, or images
5. **Save** your changes
-## Related Pages
+## Related pages
- [Uploading Files](/docs/users/models/uploading-files) - Adding files to your model
- [Uploading Images](/docs/users/models/uploading-images) - Pushing container images
diff --git a/frontend/pages/docs/users/models/model-card.mdx b/frontend/pages/docs/users/models/model-card.mdx
index 674fea88df..6c8d6cdbba 100644
--- a/frontend/pages/docs/users/models/model-card.mdx
+++ b/frontend/pages/docs/users/models/model-card.mdx
@@ -16,7 +16,7 @@ selected when creating the model.
> - How do I assign review roles?
> - What is the model card version history?
-## What is a Model Card?
+## What is a model card?
A model card serves as the authoritative documentation for a machine learning model. It helps:
@@ -24,7 +24,7 @@ A model card serves as the authoritative documentation for a machine learning mo
- **Consumers** understand what the model does and its limitations
- **Auditors** verify compliance with organisational policies
-## Filling In the Form
+## Filling in the form
The model card form is divided into sections displayed as tabs, where you answer questions defined by the selected
schema.
@@ -35,7 +35,7 @@ schema.
Each edit creates a **new version** of the model card. You can view previous versions in the model's version history.
-## Configuring Model Access
+## Configuring model access
After documenting your model, configure who can access the model and who will review releases and access requests.
@@ -54,7 +54,7 @@ collaborators and assigned system roles and review roles.
The selected roles will be notified when the model or its releases require review.
-### System Roles
+### System roles
When adding collaborators, assign one of:
@@ -62,12 +62,12 @@ When adding collaborators, assign one of:
- **Contributor** - Edit model card, upload files, create releases
- **Consumer** - Download files and pull images (with approved access request)
-### Review Roles
+### Review roles
Assign specific people to each review role required by the schema (e.g. Model Technical Reviewer, Model Senior
Responsible Officer). These people will review releases and access requests.
-## Version History
+## Version history
Every edit to the model card creates a new version that is preserved in the model's history:
@@ -75,7 +75,7 @@ Every edit to the model card creates a new version that is preserved in the mode
2. Navigate to the version history
3. Select a previous version to see the model card at that point in time
-## Related Pages
+## Related pages
- [Creating a Model](/docs/users/models/creating-a-model) - Setting up a new model
- [Creating a Release](/docs/users/models/creating-a-release) - Versioning your model
diff --git a/frontend/pages/docs/users/models/model-templating.mdx b/frontend/pages/docs/users/models/model-templating.mdx
index fd94a8916a..6fedea39a3 100644
--- a/frontend/pages/docs/users/models/model-templating.mdx
+++ b/frontend/pages/docs/users/models/model-templating.mdx
@@ -12,7 +12,7 @@ card format.
> - How do I enable templating on my model?
> - Can I copy a model card from an existing model?
-## How Templating Works
+## How templating works
Templating copies the model card structure and content from an existing model to a new model:
@@ -29,7 +29,7 @@ Both the template model and the destination model must meet certain requirements
- The template model must have **Allow templating** enabled in its settings
- You must have already created the new model (templating is applied to an existing model)
-## Using a Template
+## Using a template
Apply a template when setting up the model card for a newly created model:
@@ -40,7 +40,7 @@ Apply a template when setting up the model card for a newly created model:
5. The model card content from the template is copied to your model
6. Edit the content to reflect your specific model's details
-## Enabling Templating on a Model
+## Enabling templating on a model
Model owners can allow their model to be used as a template by other users:
@@ -51,7 +51,7 @@ Model owners can allow their model to be used as a template by other users:
Once enabled, your model will appear in the template selection dropdown for other users.
-## Programmatic Access
+## Programmatic access
You can also create a model from a template using the API or the Python client:
@@ -67,7 +67,7 @@ POST /api/v2/model/{modelId}/setup/from-template
model.card_from_template(template_id="source-model-id")
```
-## Related Pages
+## Related pages
- [Creating a Model](/docs/users/models/creating-a-model) - Standard model creation
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Programmatic workflows
diff --git a/frontend/pages/docs/users/models/uploading-files.mdx b/frontend/pages/docs/users/models/uploading-files.mdx
index ed2010ee47..8d48016c85 100644
--- a/frontend/pages/docs/users/models/uploading-files.mdx
+++ b/frontend/pages/docs/users/models/uploading-files.mdx
@@ -17,7 +17,7 @@ These files allow others to build, evaluate, and use your model.
> - How do I attach files to a release?
> - How do I upload files programmatically?
-## Adding Files to a Model
+## Adding files to a model
Upload files from the **File Management** tab on your model page:
@@ -33,7 +33,7 @@ The screenshot above shows the file upload interface with file selection, tag as
4. Click **Upload files**
-## Adding Files to a New Release
+## Adding files to a new release
When creating a new release, you can attach both newly uploaded files and files that already exist on the model.
@@ -43,7 +43,7 @@ When creating a new release, you can attach both newly uploaded files and files
The screenshot above shows the new release form with a file already attached.
-## Adding Files to an Existing Release
+## Adding files to an existing release
You can edit existing releases to add or remove file attachments.
@@ -53,7 +53,7 @@ You can edit existing releases to add or remove file attachments.
The screenshot above shows an existing release with an Edit release button for adding or removing files.
-## Uploading Files Programmatically
+## Uploading files programmatically
Use the Bailo Python Client to upload or download files via code. Examples are available
[here](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html).
diff --git a/frontend/pages/docs/users/models/uploading-images.mdx b/frontend/pages/docs/users/models/uploading-images.mdx
index bbce59715e..3b65c5016e 100644
--- a/frontend/pages/docs/users/models/uploading-images.mdx
+++ b/frontend/pages/docs/users/models/uploading-images.mdx
@@ -17,7 +17,7 @@ releases.
> - How do I add a container image to a release?
> - What is a container image?
-## Pushing an Image to a Model
+## Pushing an image to a model
Push container images to the Bailo registry from the **Registry** tab on your model page.
@@ -30,7 +30,7 @@ This tab provides step-by-step instructions tailored to your model and registry.
The screenshot above shows the Registry tab with step-by-step instructions for logging in, tagging, and pushing a
container image.
-## Adding an Image to a Release
+## Adding an image to a release
Once pushed, container images can be attached to new or existing releases.
@@ -42,7 +42,7 @@ Edit an existing release or create a new one, then select the image from the ava
The screenshot above shows a release being edited with a container image attached from the available list.
-## What is a Container?
+## What is a container?
In the context of Bailo, a container is an isolated, self-contained application environment used to run a model.
Packaging models as containers allows them to be started quickly, run consistently across environments, and used for
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
index a330664c9f..24a127b214 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/authentication.mdx
@@ -17,7 +17,7 @@ personal access tokens. Choose the method that suits your environment.
> - How do I use the Python client with authentication?
> - How do I use curl to call the Bailo API?
-## Which Method Should I Use?
+## Which method should I use?
Choose between PKI certificate authentication and token-based authentication depending on your environment.
@@ -39,7 +39,7 @@ You will need:
- A **private key** (`.pem` file)
- A **certificate authority (CA) file** (`.pem` file)
-### Using PKI with the Python Client
+### Using PKI with the Python client
```python
from bailo import PkiAgent, Client
@@ -69,7 +69,7 @@ Token-based authentication uses Personal Access Tokens (PATs) for fine-grained,
If you are not using PKI, Bailo allows the use of PATs for fine-grained access. Tokens grant access to specific models
and specific actions.
-### Creating a Token
+### Creating a token
1. Navigate to **User (top right) > Settings > Authentication**
2. Click **Add token**
@@ -94,7 +94,7 @@ an 'Add token' button.
The screenshot above shows the token creation confirmation dialog displaying the access key and secret key.
-### Using Tokens with the Python Client
+### Using tokens with the Python client
```python
from bailo import TokenAgent, Client
@@ -107,7 +107,7 @@ agent = TokenAgent(
client = Client("https://your-bailo-instance.com", agent=agent)
```
-### Using Tokens with curl
+### Using tokens with curl
Tokens use HTTP Basic Authentication with the access key as the username and secret key as the password:
@@ -116,7 +116,7 @@ curl -u "your-access-key:your-secret-key" \
https://your-bailo-instance.com/api/v2/models/search
```
-## Security Best Practices
+## Security best practices
Follow these practices to keep your API credentials secure.
@@ -126,7 +126,7 @@ Follow these practices to keep your API credentials secure.
- **Rotate tokens regularly** - delete old tokens and create new ones periodically
- **Store secret keys securely** - they cannot be retrieved after creation
-## Base Agent
+## Base agent
The full Python docs for the `Agent` class and subsequent child-classes is available
[here](../../python/bailo.core.html#bailo.core.agent.Agent). It is possible to pass `kwargs` to the base `Agent` class
@@ -141,7 +141,7 @@ Common authentication errors and their solutions.
- **Certificate errors** - Verify your certificate paths and that the CA certificate matches your Bailo instance
- **Connection refused** - Check the Bailo URL is correct and the instance is running
-## Related Pages
+## Related pages
- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Detailed token management
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using the Python client library
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
index 0ee9137901..d6bc7acf03 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/open-api.mdx
@@ -20,7 +20,7 @@ schemas.
Swagger UI lets you browse, understand, and test API (Application Programming Interface) endpoints directly in your
browser.
-### Browsing Endpoints
+### Browsing endpoints
Endpoints are grouped by category (Models, Releases, Files, Schemas, etc.). Click on a group to expand it and see all
available endpoints. Each endpoint shows:
@@ -31,7 +31,7 @@ available endpoints. Each endpoint shows:
- Request body schema (for POST/PUT/PATCH)
- Response schema and status codes
-### Making Test Requests
+### Making test requests
You can test endpoints directly from the Swagger UI:
@@ -44,7 +44,7 @@ You can test endpoints directly from the Swagger UI:
> **Note**: You must be authenticated to make requests. If you're logged into Bailo in the same browser, your session
> credentials will be used automatically.
-## Downloading the OpenAPI Specification
+## Downloading the OpenAPI specification
Download the raw OpenAPI specification in JSON format for use with code generation tools or API clients.
@@ -57,13 +57,13 @@ You can use this specification with tools like:
- [Postman](https://www.postman.com/) to import all endpoints as a collection
- [Insomnia](https://insomnia.rest/) for API testing
-## Endpoint Summary
+## Endpoint summary
For a complete list of all API endpoints, see the interactive [Swagger API](/api/docs/).
For guidance on Swagger UI itself, see the [official Swagger documentation](https://swagger.io/tools/swagger-ui/).
-## Related Pages
+## Related pages
- [Swagger API](/api/docs/) - All available API endpoints
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
index 285a11773c..b87c0399ef 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/personal-access-tokens.mdx
@@ -17,7 +17,7 @@ token can be scoped to specific models and actions, giving you fine-grained cont
> - How do I use a token with curl or the Python client?
> - How do I revoke a token?
-## Creating a Token
+## Creating a token
Create tokens from the Authentication tab in your user settings.
@@ -46,7 +46,7 @@ The screenshot above shows the token creation form with fields for description,
5. **Copy both the Access Key and Secret Key immediately** - the secret key is only shown once and cannot be retrieved
later
-## Available Permissions
+## Available permissions
Each token can be scoped to specific actions using these permission types.
@@ -68,7 +68,7 @@ Each token can be scoped to specific actions using these permission types.
> **Note**: Selecting a write permission automatically includes the corresponding read permission.
-## Token Scoping
+## Token scoping
Tokens can be scoped to all models or restricted to specific models.
@@ -77,7 +77,7 @@ Tokens can be scoped to all models or restricted to specific models.
Use specific model scoping when possible to follow the principle of least privilege.
-## Managing Tokens
+## Managing tokens
View and delete existing tokens from the Authentication tab:
@@ -88,14 +88,14 @@ View and delete existing tokens from the Authentication tab:
> **Important**: Deleting a token is immediate and permanent. Any scripts or applications using that token will stop
> working.
-## Using Tokens
+## Using tokens
Tokens use HTTP Basic Authentication with the access key as the username and the secret key as the password.
- **Username**: the access key
- **Password**: the secret key
-### With the Python Client
+### With the Python client
```python
from bailo import TokenAgent, Client
@@ -111,13 +111,13 @@ curl -u "your-access-key:your-secret-key" \
https://your-bailo-instance.com/api/v2/models/search
```
-### With the Container Registry
+### With the container registry
```bash
docker login your-registry-host -u "your-access-key" -p "your-secret-key"
```
-## Security Best Practices
+## Security best practices
Follow these practices to keep your tokens secure.
@@ -127,7 +127,7 @@ Follow these practices to keep your tokens secure.
- **Rotate tokens regularly** - delete old tokens and create new ones
- **Use separate tokens** for different purposes (CI/CD, local dev, etc.)
-## Related Pages
+## Related pages
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Overview of authentication methods
- [Python Client](/docs/users/programmatically-using-bailo/python-client) - Using tokens with the Python client
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
index cd41e0c790..bea8e4aac1 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/python-client.mdx
@@ -33,7 +33,7 @@ pip install bailo[mlflow]
Before using the client, configure authentication using either PKI (Public Key Infrastructure) certificates or Personal
Access Tokens.
-### PKI Certificate Authentication (Recommended)
+### PKI certificate authentication (Recommended)
Use a client certificate for mutual TLS:
@@ -68,7 +68,7 @@ client = Client(
)
```
-## Helper Classes
+## Helper classes
The Python client provides high-level helper classes that simplify common workflows.
@@ -79,11 +79,11 @@ The Python client provides high-level helper classes that simplify common workfl
- **Schema** - Create and retrieve schemas
- **Experiment** - Track experiments and metrics
-## Common Workflows
+## Common workflows
These examples show the most common tasks you can perform with the Python client.
-### Creating a Model
+### Creating a model
```python
from bailo import Client, Model, TokenAgent
@@ -111,7 +111,7 @@ model.update_model_card(metadata={
})
```
-### Creating a Release and Uploading Files
+### Creating a release and uploading files
```python
from bailo import Release
@@ -138,7 +138,7 @@ release = Release.create(
print(f"Release {release.version} created")
```
-### Downloading Files
+### Downloading files
```python
# Download a specific file
@@ -148,7 +148,7 @@ release.download("model_weights.pt", output_dir="./downloads")
release.download_all(output_dir="./downloads")
```
-### Managing Access Requests
+### Managing access requests
```python
from bailo import AccessRequest
@@ -167,7 +167,7 @@ access_request = AccessRequest.create(
)
```
-### Working with Data Cards
+### Working with data cards
```python
from bailo import Datacard
@@ -183,7 +183,7 @@ data_card = Datacard.create(
data_card.card_from_schema(schema_id="data-card-schema-id")
```
-### Working with Schemas
+### Working with schemas
```python
from bailo import Schema
@@ -205,7 +205,7 @@ schema = Schema.create(
)
```
-## Jupyter Notebook Examples
+## Jupyter notebook examples
Detailed, runnable examples are available as Jupyter notebooks in the Bailo repository.
@@ -216,7 +216,7 @@ Detailed, runnable examples are available as Jupyter notebooks in the Bailo repo
- [Schemas](/docs/python/notebooks/schemas_demo/index.html) - Schema creation and management
- [Experiment Tracking](/docs/python/notebooks/experiment_tracking_demo/index.html) - Tracking experiments and metrics
-## MLflow Integration
+## MLflow integration
The optional MLflow integration allows you to log models from MLflow directly to Bailo.
@@ -244,7 +244,7 @@ For advanced use cases, the `Client` class exposes lower-level methods that map
Refer to the [full API documentation](../../python/index.html) for detailed method signatures and parameters.
-## Related Pages
+## Related pages
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Detailed authentication setup
- [Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) - Creating tokens for API
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
index 1659b69ee3..a3a989b955 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
@@ -13,7 +13,7 @@ Bailo provides webhooks for programmatic, event-driven interactions with individ
a model, Bailo sends an HTTP POST request to a URL you specify, allowing you to integrate with external applications and
workflows.
-## Setting Up a Webhook
+## Setting up a webhook
Create webhooks through the API by sending a POST request with the webhook configuration:
@@ -31,7 +31,7 @@ curl -X POST https://your-bailo-instance.com/api/v2/model/{modelId}/webhooks \
}'
```
-### Webhook Configuration Options
+### Webhook configuration options
- **name** - A descriptive name for the webhook. Required.
- **uri** - The URI (Uniform Resource Identifier) that will receive the POST requests. Required.
@@ -49,7 +49,7 @@ A Bailo model's webhook can be triggered by the following events:
- **createReviewResponse** - Fires when a reviewer submits a response (approval or change request)
- **createAccessRequest** - Fires when a user submits an access request for the model
-## Request Format
+## Request format
When triggered, Bailo sends a POST request to the webhook's URI (Uniform Resource Identifier) with event-specific data.
@@ -123,18 +123,18 @@ The body of the webhook's request varies depending on the type of event.
}
```
-## Managing Webhooks
+## Managing webhooks
List, update, and delete webhooks using the API.
-### Listing Webhooks
+### Listing webhooks
```bash
curl https://your-bailo-instance.com/api/v2/model/{modelId}/webhooks \
-u "your-access-key:your-secret-key"
```
-### Updating a Webhook
+### Updating a webhook
```bash
curl -X PUT https://your-bailo-instance.com/api/v2/model/{modelId}/webhook/{webhookId} \
@@ -148,14 +148,14 @@ curl -X PUT https://your-bailo-instance.com/api/v2/model/{modelId}/webhook/{webh
}'
```
-### Deleting a Webhook
+### Deleting a webhook
```bash
curl -X DELETE https://your-bailo-instance.com/api/v2/model/{modelId}/webhook/{webhookId} \
-u "your-access-key:your-secret-key"
```
-## Security Considerations
+## Security considerations
Follow these practices to secure your webhook endpoints.
@@ -164,7 +164,7 @@ Follow these practices to secure your webhook endpoints.
- **Use HTTPS** for your webhook URI to prevent eavesdropping on the request payloads
- **Avoid `insecureSSL: true`** in production - only use it for testing with self-signed certificates
-## Related Pages
+## Related pages
- [Authentication](/docs/users/programmatically-using-bailo/authentication) - Setting up API authentication
- [Swagger API](/api/docs/) - All available API endpoints
diff --git a/frontend/pages/docs/users/reviews/review-outcomes.mdx b/frontend/pages/docs/users/reviews/review-outcomes.mdx
index 40a0a42b0a..ee5bde6213 100644
--- a/frontend/pages/docs/users/reviews/review-outcomes.mdx
+++ b/frontend/pages/docs/users/reviews/review-outcomes.mdx
@@ -12,7 +12,7 @@ including the different outcomes and what to do when changes are requested.
> - How do I view review history?
> - What happens after a model card lifecycle review is completed?
-## Release Review Outcomes
+## Release review outcomes
A release review can result in approval or a request for changes.
@@ -24,7 +24,7 @@ reviews** tab on the Reviews page. Approved releases are considered final and re
Both the **Model Technical Reviewer (MTR)** and the **Model Senior Responsible Officer (MSRO)** (or equivalent review
roles configured for the schema) must approve before a release is fully approved.
-### Changes Requested
+### Changes requested
If any reviewer requests changes, the model owner is notified. The model owner should:
@@ -32,12 +32,12 @@ If any reviewer requests changes, the model owner is notified. The model owner s
2. Make the necessary changes to the model card, files, or release notes
3. The reviewer can then re-evaluate and approve
-### Who Can Create Releases?
+### Who can create releases?
Only the **Owner** and **Contributors** of a model can create releases. See
[Roles & Permissions](/docs/reference/roles-and-permissions) for details.
-## Access Request Review Outcomes
+## Access request review outcomes
Access request reviews follow a similar approval or change-request flow.
@@ -46,17 +46,17 @@ Access request reviews follow a similar approval or change-request flow.
When the required reviewer approves an access request, the requesting user gains permission to download files and pull
container images from the model. Approved access requests move to the **Your archived reviews** tab.
-### Changes Requested
+### Changes requested
If the reviewer requests changes, the requesting user is notified. They should review the feedback and update their
access request accordingly.
-### Who Reviews Access Requests?
+### Who reviews access requests?
Access requests are typically reviewed by the **Model Senior Responsible Officer** (or equivalent). The specific review
role depends on your schema configuration.
-## Model Card Lifecycle Review Outcomes
+## Model card lifecycle review outcomes
Model card lifecycle reviews help confirm that a model card remains accurate and up to date.
@@ -67,7 +67,7 @@ reviewer must set a new review due date, which determines when the model card sh
Approved lifecycle reviews move to the **Your archived reviews** tab.
-### Changes Required Before Completion
+### Changes required before completion
If the model card is not accurate or complete, the model owner should update the model card before completing the
lifecycle review.
@@ -75,12 +75,12 @@ lifecycle review.
The reviewer should check that any outdated or missing information has been addressed, then submit the lifecycle review
with a new review due date.
-### Who Reviews Model Cards?
+### Who reviews model cards?
Model card lifecycle reviews are normally completed by **model owners** or another user responsible for maintaining the
model card.
-## Viewing Review History
+## Viewing review history
To see the history of reviews for a model:
@@ -94,14 +94,14 @@ To see all your completed reviews:
1. Click **Reviews** in the navigation bar
2. Select the **Your archived reviews** tab
-## Python Client Examples
+## Python client examples
Detailed Python examples for working with releases and access requests are available:
- [Models and Releases demo](/docs/python/notebooks/models_and_releases_demo_pytorch/index.html)
- [Access Requests demo](/docs/python/notebooks/access_requests_demo/index.html)
-## Related Pages
+## Related pages
- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works
- [Reviewing a Release](/docs/users/reviews/reviewing/releases) - Guide for reviewers
diff --git a/frontend/pages/docs/users/reviews/reviewing/access.mdx b/frontend/pages/docs/users/reviews/reviewing/access.mdx
index 082c899f5e..a7b259275a 100644
--- a/frontend/pages/docs/users/reviews/reviewing/access.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/access.mdx
@@ -14,7 +14,7 @@ handled by the **Model Senior Responsible Officer (MSRO)** (or equivalent review
> - What happens after I approve an access request?
> - Who reviews access requests?
-## Finding Access Requests to Review
+## Finding access requests to review
Navigate to the **Reviews** page from the navigation bar. Access requests awaiting your review appear in the **Your open
reviews** tab.
@@ -25,7 +25,7 @@ reviews** tab.
The screenshot above shows the Reviews page with an open access request awaiting review.
-## Reviewing an Access Request
+## Reviewing an access request
Open the access request, examine the requester's details and justification, and submit your decision.
@@ -40,7 +40,7 @@ Open the access request, examine the requester's details and justification, and
- **Approve** - grant the requested access
- **Request changes** - ask the requester to provide more information or modify their request
-## After Approval
+## After approval
Once an access request is approved:
@@ -48,14 +48,14 @@ Once an access request is approved:
- The access request moves to the **Your archived reviews** tab on the Reviews page
- The requester is notified of the approval
-## After Requesting Changes
+## After requesting changes
If you request changes:
- The requester is notified and can update their access request
- Once updated, you can review the request again
-## Related Pages
+## Related pages
- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works end-to-end
- [Review Outcomes](/docs/users/reviews/review-outcomes) - What happens after approval or change requests
diff --git a/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx b/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx
index eb116e594f..3c4b6709f5 100644
--- a/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/model-lifecycle.mdx
@@ -12,7 +12,7 @@ date. They are typically handled by the **model owner** or another user responsi
> - How do I complete a lifecycle review?
> - What happens after I submit a lifecycle review?
-## What is a Model Card Lifecycle Review?
+## What is a model card lifecycle review?
A model card lifecycle review is a periodic check of a model's documentation. It gives model owners a structured way to
confirm that the model card still reflects the current state of the model.
@@ -25,14 +25,14 @@ Lifecycle reviews are useful for checking that:
- Data, training, evaluation, and deployment information still reflects the current model
- Any organisational or governance requirements are still being met
-## Who Reviews Model Cards?
+## Who reviews model cards?
Model card lifecycle reviews are normally completed by **model owners**. Unlike release reviews and access request
reviews, lifecycle reviews are not usually assigned to a separate reviewer role.
The model owner is responsible for checking the model card and confirming that it remains accurate.
-## Setting a Lifecycle Review Date
+## Setting a lifecycle review date
A lifecycle review is created by setting a review due date on the model.
@@ -46,7 +46,7 @@ To set a lifecycle review date:
Once a due date is set, Bailo automatically creates a lifecycle review. The review can be completed when the model owner
is ready, including before the due date if appropriate.
-## Finding Lifecycle Reviews to Complete
+## Finding lifecycle reviews to complete
Navigate to the **Reviews** page from the navigation bar. Lifecycle reviews awaiting your action appear in the **Your
open reviews** tab, under the **Model card** heading.
@@ -54,7 +54,7 @@ open reviews** tab, under the **Model card** heading.
You may also be able to start the review from the model card itself by using the **Review** button in the model card
**Details** panel.
-## Completing a Lifecycle Review
+## Completing a lifecycle review
Open the lifecycle review, check the model card, and submit your response.
@@ -69,7 +69,7 @@ Open the lifecycle review, check the model card, and submit your response.
The new review due date is mandatory. It determines when the model card should next be reviewed.
-## After Submitting Your Review
+## After submitting your review
After submitting the lifecycle review:
@@ -79,7 +79,7 @@ After submitting the lifecycle review:
- A future lifecycle review will be created based on the new due date
- The review moves to the **Your archived reviews** tab on the Reviews page
-## What to Look For
+## What to look for
When completing a lifecycle review, consider checking:
@@ -91,7 +91,7 @@ When completing a lifecycle review, consider checking:
- **Data** - Are training, evaluation, or reference datasets still accurately described?
- **Governance** - Does the model card still meet any required organisational or policy expectations?
-## Related Pages
+## Related pages
- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works end-to-end
- [Reviewing a Release](/docs/users/reviews/reviewing/releases) - How to review model releases
diff --git a/frontend/pages/docs/users/reviews/reviewing/releases.mdx b/frontend/pages/docs/users/reviews/reviewing/releases.mdx
index 1d850cfb9b..41e4bee720 100644
--- a/frontend/pages/docs/users/reviews/reviewing/releases.mdx
+++ b/frontend/pages/docs/users/reviews/reviewing/releases.mdx
@@ -16,12 +16,12 @@ model, you will be notified and the release will appear in your review queue.
> - What should I look for when reviewing a release?
> - Where do I find releases to review?
-## Who Sees Release Reviews?
+## Who sees release reviews?
Release reviews are visible to users who have been assigned a **review role** on the model (e.g. Model Technical
Reviewer, Model Senior Responsible Officer). The specific roles depend on the schema attached to the model.
-## Finding Releases to Review
+## Finding releases to review
Navigate to the **Reviews** page from the navigation bar. Releases awaiting your review appear in the **Your open
reviews** tab, under the **Releases** heading.
@@ -32,7 +32,7 @@ reviews** tab, under the **Releases** heading.
The screenshot above shows the Reviews page with a list of open release reviews waiting for action.
-## Reviewing a Release
+## Reviewing a release
Open a release from the Reviews page or the model's Releases tab, examine the submission, and submit your decision:
@@ -62,7 +62,7 @@ The screenshot above shows a release on the model's Releases page with a review
The screenshot above shows the release review form with options to approve or request changes, and a comment field.
-## After Submitting Your Review
+## After submitting your review
After submitting, the model owner is notified and other reviewers can see your response.
@@ -71,7 +71,7 @@ After submitting, the model owner is notified and other reviewers can see your r
- If you requested changes, the model owner will update the release and you can review again
- Your response is visible to other reviewers and the model owner
-## What to Look For
+## What to look for
Different reviewer roles focus on different aspects of the release.
@@ -82,7 +82,7 @@ Depending on your review role, consider checking:
- **Governance reviewers**: Are data handling practices documented? Are ethical considerations addressed? Does the model
meet organisational policies?
-## Related Pages
+## Related pages
- [Understanding Reviews](/docs/users/reviews/understanding-reviews) - How the review process works end-to-end
- [Review Outcomes](/docs/users/reviews/review-outcomes) - What happens after approval or change requests
diff --git a/frontend/pages/docs/users/reviews/understanding-reviews.mdx b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
index b8732edfd2..3edfe6712a 100644
--- a/frontend/pages/docs/users/reviews/understanding-reviews.mdx
+++ b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
@@ -14,7 +14,7 @@ end-to-end.
> - What triggers a review?
> - What happens when a reviewer requests changes?
-## What Triggers a Review?
+## What triggers a review?
Reviews are created automatically when:
@@ -26,7 +26,7 @@ Reviews are created automatically when:
You do not need to manually create release or access request reviews. The system handles these based on the review roles
configured on the model. Lifecycle reviews are created from the review due date set on the model card.
-## Who Reviews What?
+## Who reviews what?
Review assignments depend on the schema's review roles, the model owner's reviewer assignments, and the type of
submission:
@@ -41,12 +41,12 @@ submission:
- **Model card lifecycle reviews**: Model owners, or another user responsible for maintaining the model card,
complete the review
-## The Review Lifecycle
+## The review lifecycle
The review lifecycle follows a structured flow from submission through reviewer evaluation to approval or change
requests.
-### For Releases
+### For releases
1. A model owner or contributor creates a new release
2. Bailo creates review tasks for each required review role
@@ -57,14 +57,14 @@ requests.
5. If changes are requested, the model owner updates the release and the reviewer re-evaluates
6. Once **all** required review roles have approved, the release is fully approved
-### For Access Requests
+### For access requests
1. A user submits an access request for a model
2. Bailo creates a review task for the appropriate review role(s)
3. The reviewer examines the request details and either approves or requests changes
4. Once approved, the requesting user gains the permissions to download files and pull images
-### For Model Card Lifecycle Reviews
+### For model card lifecycle reviews
1. A model owner sets a review due date in the model card **Details** section on the model's **Overview** tab
2. Bailo creates a lifecycle review for the model card
@@ -73,7 +73,7 @@ requests.
5. If information is missing or outdated, the model owner updates the model card
6. The model owner approves the lifecycle review and sets a new review due date
-## Checking Your Reviews
+## Checking your reviews
You can see all reviews assigned to you from the Reviews page in the navigation bar:
@@ -84,7 +84,7 @@ You can see all reviews assigned to you from the Reviews page in the navigation
Lifecycle reviews can also be opened from the model's **Overview** tab by using the **Review** button in the model card
**Details** panel.
-## Responding to a Review
+## Responding to a review
Reviewers examine the submission, add comments, and choose to approve or request changes:
@@ -99,7 +99,7 @@ Reviewers examine the submission, add comments, and choose to approve or request
You can also react to other reviewers' comments to indicate agreement or add further context.
-## Review Outcomes
+## Review outcomes
A review can result in one of three outcomes.
@@ -108,7 +108,7 @@ A review can result in one of three outcomes.
- **Changes requested** - One or more reviewers need something addressed. The submitter should update and resubmit.
- **Pending** - The review is still in progress. Not all required roles have responded yet.
-## Tips for Model Owners
+## Tips for model owners
These tips help model owners prepare for smoother reviews.
@@ -119,7 +119,7 @@ These tips help model owners prepare for smoother reviews.
- **Set lifecycle review dates** - use model card lifecycle reviews to periodically confirm that model documentation
remains accurate
-## Related Pages
+## Related pages
- [Reviewing a Release](/docs/users/reviews/reviewing/releases) - Step-by-step guide for reviewers
- [Reviewing an Access Request](/docs/users/reviews/reviewing/access) - How to review access requests
diff --git a/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx b/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
index 58495d85b2..c18f078d79 100644
--- a/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
+++ b/frontend/pages/docs/users/untrusted-models/untrusted-models.mdx
@@ -11,7 +11,7 @@ your organisation. This feature is optional and must be enabled by your administ
> - How do untrusted models differ from regular models?
> - How do I create an untrusted model?
-## What are Untrusted Models?
+## What are untrusted models?
An untrusted model is a model that has not yet been verified or validated to the same standard as a regular model. Your
organisation may use this classification for:
@@ -22,7 +22,7 @@ organisation may use this classification for:
The specific meaning of "untrusted" depends on your organisation's policies. Your administrator configures a description
that explains what untrusted models mean in your context.
-## Creating an Untrusted Model
+## Creating an untrusted model
Create an untrusted model from the model creation page if the feature is enabled by your administrator:
@@ -35,7 +35,7 @@ Create an untrusted model from the model creation page if the feature is enabled
The creation process is the same as for a regular model, but the entry is classified as untrusted.
-## How Untrusted Models Differ
+## How untrusted models differ
Untrusted models appear in the Marketplace alongside regular models but are clearly marked as untrusted. Key differences
include:
@@ -51,7 +51,7 @@ include:
This feature is controlled by your administrator. If you don't see the **Untrusted Model** option when creating a new
entry, it means the feature is not enabled in your Bailo instance.
-## Related Pages
+## Related pages
- [Creating a Model](/docs/users/models/creating-a-model) - Standard model creation
- [Core Concepts](/docs/getting-started/core-concepts) - Overview of all entry types
diff --git a/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx b/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
index bb6ac1e70b..f7049f55d4 100644
--- a/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
+++ b/frontend/pages/docs/users/using-a-model/browsing-the-marketplace.mdx
@@ -27,38 +27,38 @@ Search results are limited to the currently selected tab (**Models** or **Data C
The Marketplace provides several filter categories to narrow down results.
-### By Entry Type
+### By entry type
Use the tabs to switch between:
- **Models** - Machine learning models
- **Data Cards** - Dataset documentation
-### By Organisation
+### By organisation
Organisations are displayed below the search bar. Filter models by the organisation they belong to.
-### By State
+### By state
Filter models by their development state (e.g. in development, ready for deployment).
-### By External Sources (Federation)
+### By external sources (Federation)
If your Bailo instance is connected to other Bailo instances or external model repositories through federation, you can
filter to see models from specific external sources. External sources only appear if federation is enabled by your
administrator.
-### By Tags
+### By tags
Click a tag to filter the list to models that have been assigned that tag. You can select multiple tags to narrow your
results further.
-### By Mirrored Models
+### By mirrored models
Filter the list to show only mirrored models or data cards. Mirrored entries are replicas from external sources and are
only available if mirroring has been enabled by your administrator.
-### By Roles
+### By roles
Filter models based on your assigned role, showing only those where you hold a specific access role.
@@ -71,12 +71,12 @@ Model visibility determines whether a model appears in the Marketplace.
Even for public models, you typically need an approved access request to download files or pull container images.
-## Sharing Filtered Views
+## Sharing filtered views
Filter selections are stored in the page URL as query parameters. You can copy and share the URL to give someone the
same filtered view of the Marketplace. **Role-based filters are not included.**
-## Related Pages
+## Related pages
- [Requesting Access](/docs/users/using-a-model/requesting-access) - How to request access to a model
- [Creating a Model](/docs/users/models/creating-a-model) - Adding your own model
diff --git a/frontend/pages/docs/users/using-a-model/downloading-files.mdx b/frontend/pages/docs/users/using-a-model/downloading-files.mdx
index 76d4cada71..1277c4d579 100644
--- a/frontend/pages/docs/users/using-a-model/downloading-files.mdx
+++ b/frontend/pages/docs/users/using-a-model/downloading-files.mdx
@@ -17,7 +17,7 @@ import downloadfile3 from 'public/docs/bailo_file_download_release_page.png'
Files can be downloaded from three locations in Bailo. The File Management tab provides access to all files, while the
Releases tab and individual release pages show only files attached to releases.
-## From the File Management tab
+## From the file management tab
Download files directly from the **File Management** tab by clicking the file name.
@@ -27,7 +27,7 @@ Download files directly from the **File Management** tab by clicking the file na
The screenshot above shows the File Management tab with clickable file names for direct download.
-## From the Releases tab
+## From the releases tab
Download release-associated files from the **Releases** tab using the download link next to each file.
diff --git a/frontend/pages/docs/users/using-a-model/requesting-access.mdx b/frontend/pages/docs/users/using-a-model/requesting-access.mdx
index ace5a71725..0fa7e1f5b4 100644
--- a/frontend/pages/docs/users/using-a-model/requesting-access.mdx
+++ b/frontend/pages/docs/users/using-a-model/requesting-access.mdx
@@ -14,7 +14,7 @@ import createAccessRequest from 'public/docs/bailo_create_access_request.png'
> - What is an access request?
> - What happens after I submit an access request?
-## What is an Access Request?
+## What is an access request?
An access request is required before you can use a model. This allows model owners to authorise usage and maintain an
audit trail of who has access and for what purpose.
diff --git a/frontend/pages/docs/users/using-scanners/file-scanning.mdx b/frontend/pages/docs/users/using-scanners/file-scanning.mdx
index 51eb1c938a..d242b2d784 100644
--- a/frontend/pages/docs/users/using-scanners/file-scanning.mdx
+++ b/frontend/pages/docs/users/using-scanners/file-scanning.mdx
@@ -13,7 +13,7 @@ import rescanView from 'public/docs/bailo_file_rescan.png'
> - What scanners are used for file scanning?
> - How do I rescan a file?
-## Using Scanners
+## Using scanners
When uploading files to Bailo, your files will be automatically scanned (assuming scanners are configured and
initialised).
@@ -39,7 +39,7 @@ For scan results:
The screenshot above shows a file in the File Management tab with a scan status chip that can be clicked to view scan
results.
-## Rescan File
+## Rescan file
To rescan a file after it has been uploaded, click the 3 dots to the right of the scan results chip and select the
Rescan option.
diff --git a/frontend/pages/docs/users/using-scanners/image-scanning.mdx b/frontend/pages/docs/users/using-scanners/image-scanning.mdx
index 2b5cb55c58..f6c8835208 100644
--- a/frontend/pages/docs/users/using-scanners/image-scanning.mdx
+++ b/frontend/pages/docs/users/using-scanners/image-scanning.mdx
@@ -17,7 +17,7 @@ import multiPlatView from 'public/docs/bailo_image_multiplat_view.png'
> - What is a CVE?
> - How do I rescan an image?
-## Using Scanner
+## Using scanner
Container images pushed to the Bailo registry are automatically scanned using Trivy, a vulnerability scanner that
detects known security issues called CVEs (Common Vulnerabilities and Exposures).
@@ -57,7 +57,7 @@ You can filter these results by Severity, using the tags at the top of the page.
The screenshot above shows the detailed vulnerability report page with CVE information and severity filters.
-## Rescan Image
+## Rescan image
Trigger a rescan of a container image from the scan results menu.
@@ -70,7 +70,7 @@ Trigger a rescan of a container image from the scan results menu.
The screenshot above shows the image actions menu with a Rescan option.
-## Multiplatform Images
+## Multiplatform images
Bailo supports scanning multiplatform images, which target different architectures.
From 32e97b58b448ba9d1c2e070faba9351ccec08690 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Mon, 8 Jun 2026 07:26:15 +0000
Subject: [PATCH 19/23] Remove fullstops from bullet point lists
---
.../federation/peer-integration.mdx | 6 +-
.../helm/isolated-environments.mdx | 4 +-
.../microservices/artefact-scanners.mdx | 4 +-
.../administration/migrations/bailo-0.4.mdx | 10 +--
.../administration/migrations/bailo-2.0.mdx | 8 +-
.../review-roles/managing-review-roles.mdx | 6 +-
.../pages/docs/reference/troubleshooting.mdx | 78 +++++++++----------
.../creating-an-inference-service.mdx | 2 +-
.../programmatically-using-bailo/webhooks.mdx | 12 +--
.../docs/users/reviews/review-outcomes.mdx | 4 +-
.../users/reviews/understanding-reviews.mdx | 4 +-
.../users/using-scanners/file-scanning.mdx | 2 +-
.../users/using-scanners/image-scanning.mdx | 2 +-
13 files changed, 71 insertions(+), 71 deletions(-)
diff --git a/frontend/pages/docs/administration/federation/peer-integration.mdx b/frontend/pages/docs/administration/federation/peer-integration.mdx
index 83ecb0c754..bdb6803aa5 100644
--- a/frontend/pages/docs/administration/federation/peer-integration.mdx
+++ b/frontend/pages/docs/administration/federation/peer-integration.mdx
@@ -15,9 +15,9 @@ discover and mirror models from external sources.
Your Bailo instance can operate in one of three federation states, controlled by the administrator:
-- **Disabled** - Federation is turned off. No external sources are visible.
-- **Read Only** - Your instance can browse and mirror models from connected peers, but does not share its own models.
-- **Enabled** - Full federation: your instance both reads from and shares models with connected peers.
+- **Disabled** - Federation is turned off. No external sources are visible
+- **Read Only** - Your instance can browse and mirror models from connected peers, but does not share its own models
+- **Enabled** - Full federation: your instance both reads from and shares models with connected peers
The federation state is configured by your administrator in the application configuration.
diff --git a/frontend/pages/docs/administration/helm/isolated-environments.mdx b/frontend/pages/docs/administration/helm/isolated-environments.mdx
index 3cf626b367..4665ec5e18 100644
--- a/frontend/pages/docs/administration/helm/isolated-environments.mdx
+++ b/frontend/pages/docs/administration/helm/isolated-environments.mdx
@@ -38,8 +38,8 @@ general, keeping to the same major version will maintain compatibility with Bail
Bailo relies on many NPM (Node Package Manager) packages. The full list is available in `package-lock.json`,
`frontend/package-lock.json` and `backend/package-lock.json`. Most are standard packages with the exception of:
-- `sharp`, which is an optimised image transformer and requires some compilation tools.
-- `cypress`, which is a user interface testing tool and requires a Chromium download.
+- `sharp`, which is an optimised image transformer and requires some compilation tools
+- `cypress`, which is a user interface testing tool and requires a Chromium download
`sharp` includes instructions on installing / building without internet [here](https://sharp.pixelplumbing.com/install).
Instructions on installing `cypress` without internet are available
diff --git a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
index 782130bd02..34ddd1b7b6 100644
--- a/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
+++ b/frontend/pages/docs/administration/microservices/artefact-scanners.mdx
@@ -74,10 +74,10 @@ Trivy is used to analyse container image layers for known vulnerabilities and to
Configure scanner settings in the backend application configuration. These settings will apply to all scanners.
-- **connectors.artefactScanners.kinds** - List of enabled artefact scanner kinds. Default: `[]`.
+- **connectors.artefactScanners.kinds** - List of enabled artefact scanner kinds. Default: `[]`
- **connectors.artefactScanners.retryDelayInMinutes** - Minutes between repeated scans of the same artefact. Default:
`60`.
-- **connectors.artefactScanners.maxInitRetries** - Number of startup connection attempts before failing. Default: `5`.
+- **connectors.artefactScanners.maxInitRetries** - Number of startup connection attempts before failing. Default: `5`
- **connectors.artefactScanners.initRetryDelay** - Delay between successive startup pings (milliseconds). Default:
`5000`.
diff --git a/frontend/pages/docs/administration/migrations/bailo-0.4.mdx b/frontend/pages/docs/administration/migrations/bailo-0.4.mdx
index 70a49829dc..6cc6ec5561 100644
--- a/frontend/pages/docs/administration/migrations/bailo-0.4.mdx
+++ b/frontend/pages/docs/administration/migrations/bailo-0.4.mdx
@@ -100,8 +100,8 @@ For more information about ESM, we recommend visiting:
To support running two containers, minor changes have been made to our `helm` charts. These changes add a new 'frontend'
container, which requires no environment variables / setup. All traffic should route to the frontend container EXCEPT:
-- `/api`, which should be sent to the backend container.
-- `/v2`, which should be sent to the Docker registry.
+- `/api`, which should be sent to the backend container
+- `/v2`, which should be sent to the Docker registry
The backend environment variables / mount locations remain unchanged. The frontend serves static files, so requires
minimal setup.
@@ -118,18 +118,18 @@ existing values. If you are using a service such as helm, you may not need to ma
The configuration is now also labelled to help advise on what each setting changes. Some major changes:
-- `minio` connection options are now stored under `minio.connection` and passed directly to the `minio` library.
+- `minio` connection options are now stored under `minio.connection` and passed directly to the `minio` library
- `minio.uploadBucket` is now called `minio.buckets.uploads`
- `minio.registryBucket` is now called `minio.buckets.registry`
- `minio.createBuckets` is now called `minio.automaticallyCreateBuckets`
-- `smtp` connection options are now stored under `smtp.connection` and passed directly to the `node-mailer` library.
+- `smtp` connection options are now stored under `smtp.connection` and passed directly to the `node-mailer` library
- `s2i.builderImage` has been moved to `ui.seldonVersions` and is now an array of names and images. These are to allow
users to select the correct Seldon version to build from
- `openshift.appPublicRoute` is removed in favour of `app.protocol`, `app.host` and `app.port`
-- `openshift` is now under `build.openshift`.
+- `openshift` is now under `build.openshift`
- `uiConfig` is now `ui`
- `listen` has been split into `app.port` for the frontend and `api.port` for the backend
diff --git a/frontend/pages/docs/administration/migrations/bailo-2.0.mdx b/frontend/pages/docs/administration/migrations/bailo-2.0.mdx
index 9d2a36658c..df3c34deeb 100644
--- a/frontend/pages/docs/administration/migrations/bailo-2.0.mdx
+++ b/frontend/pages/docs/administration/migrations/bailo-2.0.mdx
@@ -18,15 +18,15 @@ gradual migration.
No architecture has significantly changed. We still require two application containers (frontend and backend), a
registry container and an nginx routing container. We also continue to store all data in:
-- MongoDB for all metadata storage.
-- An S3 (Simple Storage Service) compatible platform for all binary storage.
+- MongoDB for all metadata storage
+- An S3 (Simple Storage Service) compatible platform for all binary storage
Whilst storage methods remain the same, all tables and keys are unique between V1 and V2 which allows for simultaneously
running multiple versions:
- All MongoDB collections are now prefixed with `v2_`
-- The registry now uses `model_id` as a namespace, instead of either `internal` or `deployment_id`.
-- Models are now kept within the `beta` s3 path.
+- The registry now uses `model_id` as a namespace, instead of either `internal` or `deployment_id`
+- Models are now kept within the `beta` s3 path
Bailo provides the `migrateV2` script, which can be run in order to convert existing models from the older format to the
new system. Users who do not use the default schemas will have to implement their own conversion functions. See the
diff --git a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
index 117cfc2434..52e7eb2134 100644
--- a/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
+++ b/frontend/pages/docs/administration/review-roles/managing-review-roles.mdx
@@ -95,8 +95,8 @@ These examples show typical governance setups using review roles.
The most common setup uses two review roles:
-- **Model Technical Reviewer (MTR)**: Reviews technical quality. System role: Contributor.
-- **Model Senior Responsible Officer (MSRO)**: Reviews governance and compliance. System role: Owner.
+- **Model Technical Reviewer (MTR)**: Reviews technical quality. System role: Contributor
+- **Model Senior Responsible Officer (MSRO)**: Reviews governance and compliance. System role: Owner
Both roles are attached to the model card schema. A release is only approved when both the MTR and MSRO approve it.
@@ -104,7 +104,7 @@ Both roles are attached to the model card schema. A release is only approved whe
For simpler workflows, a single review role may be sufficient:
-- **Model Reviewer**: Reviews all aspects. System role: Contributor.
+- **Model Reviewer**: Reviews all aspects. System role: Contributor
### Fixed reviewer
diff --git a/frontend/pages/docs/reference/troubleshooting.mdx b/frontend/pages/docs/reference/troubleshooting.mdx
index 6a8707dfcd..05fd7ee71e 100644
--- a/frontend/pages/docs/reference/troubleshooting.mdx
+++ b/frontend/pages/docs/reference/troubleshooting.mdx
@@ -19,18 +19,18 @@ Common issues with finding, editing, and deleting models.
- **Private models** are only visible to collaborators. Ask the model owner to add you, or check whether the model is
set to public.
-- **Filters may be active.** Clear any search terms, tag filters, or organisation filters.
-- If the model was recently created, try refreshing the page.
+- **Filters may be active.** Clear any search terms, tag filters, or organisation filters
+- If the model was recently created, try refreshing the page
### I can't edit a model
-- Only **Owners** and **Contributors** can edit model cards. Check your role on the model's Settings tab.
-- If you need access, ask the model owner to add you as a collaborator.
+- Only **Owners** and **Contributors** can edit model cards. Check your role on the model's Settings tab
+- If you need access, ask the model owner to add you as a collaborator
### I can't delete a model
-- Only the model **Owner** can delete a model.
-- Deletion is permanent for the model and all its associated releases, files, and access requests.
+- Only the model **Owner** can delete a model
+- Deletion is permanent for the model and all its associated releases, files, and access requests
## Releases
@@ -38,14 +38,14 @@ Common issues with creating releases and the review process.
### My release is stuck in review
-- Check that **all required review roles** have been assigned to specific people in the model's Settings tab.
-- If reviewers haven't been assigned, no one will be notified of the review.
-- Contact the assigned reviewers directly if the review has been pending for a long time.
+- Check that **all required review roles** have been assigned to specific people in the model's Settings tab
+- If reviewers haven't been assigned, no one will be notified of the review
+- Contact the assigned reviewers directly if the review has been pending for a long time
### I can't create a release
-- Only **Owners** and **Contributors** can create releases.
-- Make sure you have filled in the required fields: version (semver format), and release notes.
+- Only **Owners** and **Contributors** can create releases
+- Make sure you have filled in the required fields: version (semver format), and release notes
## Access requests
@@ -55,13 +55,13 @@ Common issues with access request approval and file downloads.
- Access requests are reviewed by the Model Senior Responsible Officer (or equivalent review role). Check who is
assigned to that role in the model's Settings tab.
-- Contact the reviewer directly if the request has been pending.
+- Contact the reviewer directly if the request has been pending
### I can't download files even though I have access
-- Your access request must be **approved**, not just submitted.
-- Check the status of your access request on the model page.
-- If the model has **ungoverned access** enabled, you should be able to download without an access request.
+- Your access request must be **approved**, not just submitted
+- Check the status of your access request on the model page
+- If the model has **ungoverned access** enabled, you should be able to download without an access request
## Container (Docker) Images
@@ -69,22 +69,22 @@ Common issues with pushing and pulling container images.
### I can't push a container image
-- Make sure you're using the correct registry address (check with your administrator).
-- Verify your personal access token has the `image:push` permission.
-- Ensure your token is scoped to the correct model (or set to "All models").
-- Check that you're logged into the registry with `docker login`.
+- Make sure you're using the correct registry address (check with your administrator)
+- Verify your personal access token has the `image:push` permission
+- Ensure your token is scoped to the correct model (or set to "All models")
+- Check that you're logged into the registry with `docker login`
### I can't pull a container image
-- You need an **approved access request** for the model (unless ungoverned access is enabled).
-- Verify your personal access token has the `image:read` permission.
-- Check the registry address is correct.
+- You need an **approved access request** for the model (unless ungoverned access is enabled)
+- Verify your personal access token has the `image:read` permission
+- Check the registry address is correct
-## Personal Access Tokens
+## Personal Access tokens
Common issues with creating and using Personal Access Tokens (PATs).
-### How do I create a token?
+### How do i create a token?
Navigate to **User (top right) > Settings > Authentication** and click **Add token**. See
[Personal Access Tokens](/docs/users/programmatically-using-bailo/personal-access-tokens) for details.
@@ -95,9 +95,9 @@ Secret keys are only shown once when the token is created. If you've lost it, de
### My token isn't working
-- Check that the token has the correct **permissions** for the action you're trying to perform.
-- Check that the token is **scoped to the correct model** (or set to "All models").
-- Verify you're using the correct access key and secret key pair.
+- Check that the token has the correct **permissions** for the action you're trying to perform
+- Check that the token is **scoped to the correct model** (or set to "All models")
+- Verify you're using the correct access key and secret key pair
## Schemas and forms
@@ -105,14 +105,14 @@ Common issues with schema validation and form fields.
### Schema validation errors when filling in a model card
-- Required fields are marked - make sure all required fields are filled in.
-- Check that dates are in the correct format.
-- If a field appears read-only, it may be controlled by a dependency on another field's value.
+- Required fields are marked - make sure all required fields are filled in
+- Check that dates are in the correct format
+- If a field appears read-only, it may be controlled by a dependency on another field's value
### I can't see a schema when creating a model
-- Only **active** schemas appear in the selection list. An administrator may have deactivated the schema.
-- Contact your administrator if you need a specific schema.
+- Only **active** schemas appear in the selection list. An administrator may have deactivated the schema
+- Contact your administrator if you need a specific schema
## Security scanning
@@ -120,23 +120,23 @@ Common issues with file and container image scan results.
### A file scan shows issues
-- **ClamAV** detects malware. If a file is flagged, do not distribute it until the issue is investigated.
+- **ClamAV** detects malware. If a file is flagged, do not distribute it until the issue is investigated
- **ModelScan** detects serialisation attacks (e.g. in pickle files). Review the flagged file for unsafe deserialisation
patterns.
-- You can **rescan** a file after a cooldown period if you believe the result is a false positive.
+- You can **rescan** a file after a cooldown period if you believe the result is a false positive
### A container image scan shows vulnerabilities
-- **Trivy** reports known vulnerabilities (CVEs) with severity ratings.
-- Review the vulnerability details to determine impact.
-- Update base images or dependencies to address critical vulnerabilities.
-- You can rescan an image after updating it.
+- **Trivy** reports known vulnerabilities (CVEs) with severity ratings
+- Review the vulnerability details to determine impact
+- Update base images or dependencies to address critical vulnerabilities
+- You can rescan an image after updating it
## Administration
Common administration questions.
-### How do I contact an administrator?
+### How do i contact an administrator?
Check the **Help** page in Bailo for support links and contact information specific to your deployment.
diff --git a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
index 9adff20f86..76ba695a4a 100644
--- a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
+++ b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
@@ -36,7 +36,7 @@ Create an inference service from the Inferencing tab on your model page.
### Choosing a processor type
-- **CPU**: Available on all deployments. You'll need to specify memory allocation (1-8 GB).
+- **CPU**: Available on all deployments. You'll need to specify memory allocation (1-8 GB)
- **GPU**: Available GPU types depend on your deployment's configuration. GPU options are configured by your
administrator.
diff --git a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
index a3a989b955..e0229bd684 100644
--- a/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
+++ b/frontend/pages/docs/users/programmatically-using-bailo/webhooks.mdx
@@ -33,12 +33,12 @@ curl -X POST https://your-bailo-instance.com/api/v2/model/{modelId}/webhooks \
### Webhook configuration options
-- **name** - A descriptive name for the webhook. Required.
-- **uri** - The URI (Uniform Resource Identifier) that will receive the POST requests. Required.
-- **token** - A bearer token included in the `Authorization` header of webhook requests. Optional.
-- **events** - Which events trigger this webhook (see Events below). Optional, defaults to all events.
-- **active** - Whether the webhook is enabled. Optional, defaults to true.
-- **insecureSSL** - Skip SSL (Secure Sockets Layer) verification for the target URL. Optional, defaults to false.
+- **name** - A descriptive name for the webhook. Required
+- **uri** - The URI (Uniform Resource Identifier) that will receive the POST requests. Required
+- **token** - A bearer token included in the `Authorization` header of webhook requests. Optional
+- **events** - Which events trigger this webhook (see Events below). Optional, defaults to all events
+- **active** - Whether the webhook is enabled. Optional, defaults to true
+- **insecureSSL** - Skip SSL (Secure Sockets Layer) verification for the target URL. Optional, defaults to false
## Events
diff --git a/frontend/pages/docs/users/reviews/review-outcomes.mdx b/frontend/pages/docs/users/reviews/review-outcomes.mdx
index ee5bde6213..88824073d8 100644
--- a/frontend/pages/docs/users/reviews/review-outcomes.mdx
+++ b/frontend/pages/docs/users/reviews/review-outcomes.mdx
@@ -84,8 +84,8 @@ model card.
To see the history of reviews for a model:
-- **Releases**: Open the model page and navigate to the **Releases** tab. Each release shows its review status.
-- **Access requests**: Open the model page and navigate to the **Access Requests** tab.
+- **Releases**: Open the model page and navigate to the **Releases** tab. Each release shows its review status
+- **Access requests**: Open the model page and navigate to the **Access Requests** tab
- **Model card lifecycle reviews**: Open the model page and navigate to the **Overview** tab. The model card details
show lifecycle review information where configured.
diff --git a/frontend/pages/docs/users/reviews/understanding-reviews.mdx b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
index 3edfe6712a..7bd141fbca 100644
--- a/frontend/pages/docs/users/reviews/understanding-reviews.mdx
+++ b/frontend/pages/docs/users/reviews/understanding-reviews.mdx
@@ -105,8 +105,8 @@ A review can result in one of three outcomes.
- **Approved** - All required review roles have approved. The release access request, or model card lifecycle review is
finalised.
-- **Changes requested** - One or more reviewers need something addressed. The submitter should update and resubmit.
-- **Pending** - The review is still in progress. Not all required roles have responded yet.
+- **Changes requested** - One or more reviewers need something addressed. The submitter should update and resubmit
+- **Pending** - The review is still in progress. Not all required roles have responded yet
## Tips for model owners
diff --git a/frontend/pages/docs/users/using-scanners/file-scanning.mdx b/frontend/pages/docs/users/using-scanners/file-scanning.mdx
index d242b2d784..c055ecd46f 100644
--- a/frontend/pages/docs/users/using-scanners/file-scanning.mdx
+++ b/frontend/pages/docs/users/using-scanners/file-scanning.mdx
@@ -30,7 +30,7 @@ For scan results:
- Go to your model and click on File Management Tab
- Click the Scan chip, towards the right of your file
-- View scan results. Each scanning tool will have its results listed separately.
+- View scan results. Each scanning tool will have its results listed separately
diff --git a/frontend/pages/docs/users/using-scanners/image-scanning.mdx b/frontend/pages/docs/users/using-scanners/image-scanning.mdx
index f6c8835208..ed25a0dbb7 100644
--- a/frontend/pages/docs/users/using-scanners/image-scanning.mdx
+++ b/frontend/pages/docs/users/using-scanners/image-scanning.mdx
@@ -47,7 +47,7 @@ includes the following information:
- Compressed image size
- Vulnerabilities
- Scanner used
-- Detailed vulnerability report, containing CVE information.
+- Detailed vulnerability report, containing CVE information
You can filter these results by Severity, using the tags at the top of the page.
From 33a840b0326edca065580f131737019e9e1c7683 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Mon, 8 Jun 2026 08:00:16 +0000
Subject: [PATCH 20/23] Add a style guide
---
frontend/pages/docs/style-guide.mdx | 274 ++++++++++++++++++++++++++++
1 file changed, 274 insertions(+)
create mode 100644 frontend/pages/docs/style-guide.mdx
diff --git a/frontend/pages/docs/style-guide.mdx b/frontend/pages/docs/style-guide.mdx
new file mode 100644
index 0000000000..29f5827793
--- /dev/null
+++ b/frontend/pages/docs/style-guide.mdx
@@ -0,0 +1,274 @@
+import DocsWrapper from 'src/docs/DocsWrapper'
+
+# Documentation Style Guide
+
+This guide defines the writing, formatting, and structural conventions for all documentation under
+`frontend/pages/docs`. Follow these guidelines when writing new pages or editing existing ones to ensure consistency
+across the documentation.
+
+---
+
+## File format
+
+All documentation pages are written in MDX (`.mdx`) and must:
+
+- Import and use `DocsWrapper` as the default export wrapper
+- End with the default export statement:
+
+ ```mdx
+ export default ({ children }) => {children}
+ ```
+
+- Use the `next/legacy/image` `Image` component for all images (never standard Markdown image syntax for in-page
+ screenshots)
+- Import MUI components (e.g. `Box`) for layout wrapping where needed
+
+---
+
+## Page structure
+
+Every page must follow this order:
+
+1. **H1 title** (`#`) - one per page, at the top
+2. **Common questions callout** - immediately below the title
+3. **Body content** - sections using H2 (`##`) and H3 (`###`) headings
+4. **Related or next steps section** - at the bottom, before the export
+
+### H1 title
+
+- Title Case
+- Concise and descriptive
+- One per page only
+
+```mdx
+# Creating a Model
+```
+
+### Common questions callout
+
+Every page must include a blockquote immediately after the H1 that lists two to five questions the page answers.
+
+Use bold for the label:
+
+> Common questions this page answers:
+>
+> - What does this feature do?
+> - How do I configure it?
+> - Who can use it?
+
+---
+
+## Headings
+
+- Use `##` (H2) for major sections
+- Use `###` (H3) for subsections within a major section
+- Do not skip heading levels
+- Sentence case for H2 and below (Title Case for H1 only)
+- Do not use H4 or deeper - restructure the content instead
+
+```mdx
+## Security scanning
+
+### ClamAV
+```
+
+## Writing style
+
+- **Audience**: assume a technical but non-expert reader unless the page is explicitly under `administration/`
+- **Voice**: active voice, second person ("you", "your")
+- **Tone**: professional and direct; avoid filler phrases and unnecessary pleasantries
+- **UK English**: use UK spelling throughout (e.g. artefact, organise, colour)
+- **Sentence length**: prefer short, clear sentences; break long sentences into lists where appropriate
+- **Tense**: present tense throughout
+
+---
+
+## Lists
+
+Use unordered lists (`-`) for:
+
+- Features, options, or capabilities with no inherent order
+- Role or permission enumerations
+- Sets of related items
+
+Use ordered lists (`1.`) for:
+
+- Step-by-step instructions where sequence matters
+
+Nested lists are permitted up to one level of nesting. Avoid deeper nesting.
+
+Format list items consistently within the same list - either all fragments or all full sentences, not mixed.
+
+**Bold** the lead term for definition-style lists, followed by a dash and a description:
+
+```mdx
+- **Owner** - Full control: edit model, manage collaborators, create releases, delete the model
+- **Contributor** - Edit the model card, upload files and images, create releases
+```
+
+Avoid ending list items with punctuation (e.g. no full stops at the end of sentences).
+
+---
+
+## Code and technical terms
+
+- Use backticks for inline code, filenames, configuration keys, version strings, CLI commands, and technical identifiers
+- Use fenced code blocks for multi-line code or configuration, with a language identifier
+- Use semantic versioning examples consistently: `1.0.0`, `1.1.0`, `2.0.0`
+
+ ```mdx
+ - **connectors.artefactScanners.kinds** - List of enabled artefact scanner kinds. Default: `[]`
+ ```
+
+````mdx
+```
+Create Model → Select Schema → Fill In Model Card → Add Collaborators
+```
+````
+
+---
+
+## Emphasis
+
+- **Bold** (`**text**`): UI element names, key terms on first use, lead terms in definition lists
+- _Italic_: use sparingly, only for genuine emphasis or titles of external works
+- Do not use bold for general emphasis or decoration
+
+---
+
+## Links
+
+- Use descriptive link text that reflects the destination page title
+- Do not use "click here" or bare URLs as link text
+- Internal links use root-relative paths starting with `/docs/`
+- External links use full URLs
+
+```mdx
+[Quick Start Guide](/docs/getting-started/quick-start) [ClamAV](https://www.clamav.net/)
+```
+
+---
+
+## Images
+
+Wrap all images in a `Box` component to control width, centred using `margin: 'auto'`:
+
+```mdx
+
+
+
+```
+
+- Import images at the top of the file using static imports
+- Always provide descriptive `alt` text in lowercase (not title case)
+- Follow every image with a plain-text caption sentence on the line immediately below the closing ` ` tag,
+ describing what the screenshot shows
+
+ ```mdx
+ The screenshot above shows the file actions menu with a Delete File option.
+ ```
+
+## Callouts and notes
+
+Use blockquotes for callouts. Reserve them for:
+
+- The common questions block (required, at top of every page)
+- Quoted external definitions or descriptions of third-party tools
+
+Do not use blockquotes for general warnings or tips - integrate these into the body text instead.
+
+---
+
+## Section endings
+
+End pages with one of the following sections (or multiple if appropriate), using an H2 heading:
+
+### "What's Next?" (conceptual/overview pages)
+
+Use for pages that introduce concepts and naturally lead the reader forward:
+
+```mdx
+## What's Next?
+
+- [Quick Start Guide](/docs/getting-started/quick-start) - Walk through creating your first model
+- [Glossary](/docs/reference/glossary) - Definitions of all Bailo-specific terms
+```
+
+### "Next steps" (task/how-to pages)
+
+Use for pages that describe completing a task, showing what to do after:
+
+```mdx
+## Next steps
+
+After creating a model and selecting a schema:
+
+1. [Fill in the model card](/docs/users/models/model-card) - document your model
+2. [Upload files](/docs/users/models/uploading-files) - add model artefacts
+3. [Create a release](/docs/users/models/creating-a-release) - version your model for distribution
+```
+
+### "Related pages"
+
+Optionally included on any page to surface related documentation:
+
+```mdx
+## Related pages
+
+- [Model Card](/docs/users/models/model-card) - Filling in the model card and configuring access
+- [Core Concepts](/docs/getting-started/core-concepts) - Understanding the Bailo data model
+```
+
+---
+
+## Directory conventions
+
+| Path | Content type |
+| ------------------ | -------------------------------------------------- |
+| `getting-started/` | Onboarding guides and conceptual overviews |
+| `users/` | Task-based guides for day-to-day platform use |
+| `administration/` | Deployment, configuration, and platform management |
+| `reference/` | Glossary, roles and permissions, troubleshooting |
+
+Page filenames use kebab-case and match the H1 title of the page as closely as possible.
+
+---
+
+## AWS RAG writing best practices
+
+We also follow the
+[AWS documentation best practices for RAG applications](https://docs.aws.amazon.com/prescriptive-guidance/latest/writing-best-practices-rag/best-practices.html).
+The key practices are summarised below:
+
+- **Use headings and subheadings consistently** - Clear, hierarchical headings help RAG models understand document
+ structure and extract relevant information accurately
+- **Keep numbered lists sequential** - Do not skip numbers in ordered lists; gaps cause confusion for both human readers
+ and LLMs processing the content
+- **Add transitions between list items** - Where steps or items are related, use bridging phrases (e.g. "Once you have
+ completed the above...") to connect ideas and preserve logical flow
+- **Avoid tables** - Replace tabular content with multi-level bullet lists or flat-level syntax (items arranged at the
+ same hierarchical level, without nesting); this format is more reliably processed by LLMs
+- **Describe graphical content in text** - Summarise or describe the content of images and diagrams in accompanying
+ text; this preserves meaning for RAG models that may not process images, and avoids unnecessary token consumption
+- **Add session starters for common queries** - Where a section answers a predictable question, open with a short
+ sentence that frames the content (e.g. "If you are looking to configure X, follow the steps below"); this improves
+ semantic matching during retrieval
+- **Summarise each section** - Include a brief summary immediately after each heading; this reinforces key points,
+ improves embedding-space similarity search, and increases the likelihood of accurate retrieval
+- **Keep content focused and unambiguous** - Each page or section should cover one topic clearly; RAG models generate
+ responses from retrieved excerpts, so avoiding ambiguity leads to more accurate and useful outputs
+- **Define abbreviations and domain-specific terms** - LLMs do not have inherent knowledge of internal terminology;
+ define acronyms and Bailo-specific language on first use to reduce the risk of misinterpretation or hallucination
+- **Break large documents into smaller, self-contained pages** - Avoid pages that span multiple unrelated subtopics;
+ smaller, clearly titled documents improve indexing, tagging, and retrieval precision
+
+---
+
+## Contributing
+
+All documentation source files are in the
+[Bailo GitHub repository](https://github.com/gchq/Bailo/tree/main/frontend/pages/docs).
+
+Contributions and corrections are welcome via pull request.
+
+export default ({ children }) => {children}
From d8207e933779036d407e814e7f9405e16c2baf4d Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Mon, 8 Jun 2026 08:54:02 +0000
Subject: [PATCH 21/23] Fix docs build issue
---
lib/landing/scripts/generate.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/landing/scripts/generate.js b/lib/landing/scripts/generate.js
index a7a1330957..cd57046567 100644
--- a/lib/landing/scripts/generate.js
+++ b/lib/landing/scripts/generate.js
@@ -21,7 +21,7 @@ function alterFile(path) {
)
content = content.replaceAll(
- `export default ({ children }) => {children} `,
+ /^export default \(\{ children \}\) => \{children\}<\/DocsWrapper>$/gm,
dedent(`
export default ({ children, menu }) => {children}
export async function getStaticProps() {
From 3fa4dc064e43ac004b3856c54b69a9327eaa768e Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Mon, 8 Jun 2026 15:21:52 +0100
Subject: [PATCH 22/23] Update
frontend/pages/docs/administration/schemas/create-a-schema.mdx
Co-authored-by: JRB66955 <214850388+JRB66955@users.noreply.github.com>
---
frontend/pages/docs/administration/schemas/create-a-schema.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/pages/docs/administration/schemas/create-a-schema.mdx b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
index f134c699f0..6b70baaa15 100644
--- a/frontend/pages/docs/administration/schemas/create-a-schema.mdx
+++ b/frontend/pages/docs/administration/schemas/create-a-schema.mdx
@@ -14,7 +14,7 @@ non-technical overview.
> - How do I create a schema in Bailo?
> - What question types are available in schemas?
> - How do I add conditional fields to a schema?
-> - # How do I test a schema?
+> - How do I test a schema?
## Before you start
From 77d5d95670802bb43c9d03cf7b07ec02d2a50505 Mon Sep 17 00:00:00 2001
From: PE39806 <185931318+PE39806@users.noreply.github.com>
Date: Mon, 8 Jun 2026 15:24:55 +0100
Subject: [PATCH 23/23] Update creating-an-inference-service.mdx
---
.../inferencing/creating-an-inference-service.mdx | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
index 76ba695a4a..ee03521a8e 100644
--- a/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
+++ b/frontend/pages/docs/users/inferencing/creating-an-inference-service.mdx
@@ -27,18 +27,18 @@ Create an inference service from the Inferencing tab on your model page.
2. Navigate to the **Inferencing** tab
3. Click **Create a new Inferencing Service**
4. Populate the following required fields:
- - **Description**: What this inference service does. Required.
- - **Image**: Select from the model's available container images. Required.
- - **Port**: The port your model exposes for inference requests (1-65535). Required.
- - **Processor Type**: Choose CPU or an available GPU type. Required.
- - **Memory**: Memory allocation in GB (1-8 GB, shown for CPU only). Required for CPU.
+ - **Description**: What this inference service does. Required
+ - **Image**: Select from the model's available container images. Required
+ - **Port**: The port your model exposes for inference requests (1-65535). Required
+ - **Processor Type**: Choose CPU or an available GPU type. Required
+ - **Memory**: Memory allocation in GB (1-8 GB, shown for CPU only). Required for CPU
5. Once all fields are filled in, click **Create Inferencing Service**
### Choosing a processor type
- **CPU**: Available on all deployments. You'll need to specify memory allocation (1-8 GB)
- **GPU**: Available GPU types depend on your deployment's configuration. GPU options are configured by your
- administrator.
+ administrator
### Choosing a port