docs/static/v0.9/project/contributing/contributing-schemas/index.html
This comprehensive guide covers everything you need to know to contribute to the Meshery Schemas repository. Meshery follows Schema-Driven Development (SDD), where the structure of data is centrally defined using schemas that power consistency, validation, and code generation across the platform.
api.yml - The Construct Index Filex-* Annotations)Meshery schemas offer a powerful system designed for:
Meshery uses the OpenAPI v3 specification with a modular, versioned, and extensible schema strategy:
Before contributing, ensure you have the following installed:
# Verify installation
go version
Essential for generating Go code from OpenAPI specifications:
go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest
export PATH="${GOPATH:-$HOME/go}/bin:$PATH"
Required for TypeScript generation and build process:
# Verify installation
node --version
npm --version
The repository uses Makefiles for automation:
# Verify installation
make --version
# Clone the repository
git clone https://github.com/meshery/schemas.git
cd schemas
# Install dependencies
make setup
npm install
# Generate all code (Go, TypeScript, RTK Query)
make build
# Build TypeScript distribution
npm run build
All schemas are located in the schemas/constructs/ directory:
schemas/
├── constructs/
│ ├── <schema-version>/ # e.g., v1alpha1, v1beta1
│ │ └── <construct>/ # e.g., model, component, design
│ │ ├── api.yml # Index file: refs subschemas + defines API endpoints
│ │ ├── <construct>.yaml # Subschema: data model definition
│ │ ├── <construct>_core.yml # Subschema: core/shared types (optional)
│ │ └── templates/ # Manually defined template files
│ │ ├── <construct>_template.json
│ │ └── <construct>_template.yaml
│ │
│ ├── v1alpha1/
│ │ ├── core/
│ │ │ └── api.yml # Core schema definitions (timestamps, UUIDs, etc.)
│ │ └── capability/
│ │ └── api.yml
│ │
│ ├── v1alpha3/
│ │ └── relationship/
│ │ ├── api.yml
│ │ ├── relationship_core.yml
│ │ └── templates/
│ │
│ └── v1beta1/
│ ├── model/
│ │ ├── api.yml
│ │ ├── model.yaml
│ │ ├── model_core.yml
│ │ └── templates/
│ ├── component/
│ │ ├── api.yml
│ │ ├── component.yaml
│ │ └── templates/
│ ├── design/
│ ├── environment/
│ ├── workspace/
│ └── ...
│
├── models/ # Auto-generated Go code (do NOT commit)
│ └── <version>/<package>/<package>.go
│
├── typescript/
│ ├── index.ts # Manually maintained - public API surface
│ ├── generated/ # Auto-generated TypeScript (do NOT commit)
│ │ └── <version>/<package>/
│ │ ├── <Package>.d.ts # Type definitions
│ │ └── <Package>Schema.ts # Schema as JS object
│ └── rtk/ # RTK Query client configurations
│
├── dist/ # Built distribution (do NOT commit)
│ ├── index.js, index.d.ts
│ ├── cloudApi.js, mesheryApi.js
│ └── constructs/<version>/<package>/<Package>Schema.js
│
└── _openapi_build/ # Bundled OpenAPI specs (do NOT commit)
├── merged_openapi.yml
├── cloud_openapi.yml
└── meshery_openapi.yml
api.yml - The Construct Index FileEach construct directory contains an api.yml file that serves as the index file for that construct. This is the entry point for code generation tools.
api.yml$refapi.yml Structureopenapi: 3.0.0
info:
title: Model API
version: v1beta1
paths:
/api/models:
get:
operationId: getModels
summary: Get all models
responses:
"200":
description: Success
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ModelDefinition"
post:
operationId: createModel
summary: Create a new model
# ...
components:
schemas:
ModelDefinition:
$ref: "./model.yaml#/ModelDefinition" # Reference to subschema
ModelReference:
$ref: "./model_core.yml#/ModelReference" # Reference to another subschema
| File | Purpose |
|---|---|
api.yml | Index file - aggregates all subschemas via $ref and defines API endpoints for the construct |
<construct>.yaml | Subschema - defines the main data model (noun) for the construct |
<other-subschemas>.yml | Subschema - defines core/shared types used by the main schema |
templates/*.json | Templates - example instances with default values |
schemaVersion, displayName, componentsCountmodelId, registrantId, categoryIdenabled, ignored, duplicatecomponents/schemas: Model, Component, Designapi.yml, model.yaml, component.yamltemplates/<construct>_template.json/api with kebab-case, plural nouns : /api/workspaces, /api/environments{subscriptionId}, {connectionId}.../register, .../export, .../canceloperationId is camelCase VerbNoun : getModels, createDesign, registerMeshmodelsschemaVersion uses group/version : models.meshery.io/v1beta1, components.meshery.io/v1beta1v1, v1alpha1, v1beta11.0.0, 2.3.1DB-mirrored fields such as created_at, updated_at, and user_id intentionally remain snake_case to mirror existing database columns. Do not rename these to camelCase.
mkdir -p schemas/constructs/v1beta1/mypackage/templates
api.yml)Create schemas/constructs/v1beta1/mypackage/api.yml:
openapi: 3.0.0
info:
title: MyPackage API
version: v1beta1
description: API for managing MyPackage resources
paths:
/api/mypackages:
get:
operationId: getMyPackages
summary: Get all mypackages
tags:
- MyPackage
responses:
"200":
description: Success
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/MyPackage"
post:
operationId: createMyPackage
summary: Create a new mypackage
tags:
- MyPackage
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/MyPackage"
responses:
"201":
description: Created
components:
schemas:
MyPackage:
$ref: "./mypackage.yaml#/MyPackage"
Create schemas/constructs/v1beta1/mypackage/mypackage.yaml:
MyPackage:
type: object
required:
- id
- name
properties:
id:
$ref: ../../v1alpha1/core/api.yml#/components/schemas/uuid
x-order: 1
name:
type: string
description: Name of the package
minLength: 1
maxLength: 100
x-order: 2
description:
type: string
description: Description of the package
x-order: 3
created_at:
$ref: ../../v1alpha1/core/api.yml#/components/schemas/created_at
x-order: 10
updated_at:
$ref: ../../v1alpha1/core/api.yml#/components/schemas/updated_at
x-order: 11
Create schemas/constructs/v1beta1/mypackage/templates/mypackage_template.json:
{
"id": "00000000-0000-0000-0000-000000000000",
"name": "Example Package",
"description": "An example package instance",
"created_at": "0001-01-01T00:00:00Z",
"updated_at": "0001-01-01T00:00:00Z"
}
# Run the build - your schema will be automatically discovered
make build
npm run build
# Verify Go code was generated
ls models/v1beta1/mypackage/
# Verify TypeScript was generated
ls typescript/generated/v1beta1/mypackage/
model.yaml or api.yml):properties:
# ... existing properties
newField:
type: string
description: Description of the new field
x-order: 20
x-oapi-codegen-extra-tags:
yaml: "newField"
json: "newField"
{
"newField": "default value"
}
make build
npm run build
Edit the api.yml file to add new paths:
paths:
# ... existing paths
/api/models/{id}/export:
post:
operationId: exportModel
summary: Export a model
parameters:
- $ref: "../../v1alpha1/core/api.yml#/components/parameters/id"
responses:
"200":
description: Model exported successfully
The build system generates code from your schemas automatically.
schemas/constructs/**/*.yml (you write these)
│
▼
bundle-openapi.js (bundles + dereferences schemas)
│
├──▶ generate-golang.js → models/**/*.go (Go structs via oapi-codegen)
├──▶ generate-typescript.js → typescript/generated/ (TypeScript types)
└──▶ generate-rtk.js → typescript/rtk/ (RTK Query hooks)
| Output | Location | Description |
|---|---|---|
| Go structs | models/<version>/<package>/ | Strongly-typed models for backend |
| TypeScript types | typescript/generated/<version>/<package>/<Package>.d.ts | Interface definitions |
| TypeScript schemas | typescript/generated/<version>/<package>/<Package>Schema.ts | OpenAPI schema as const JS object |
| RTK Query clients | typescript/rtk/ | Auto-generated API hooks for Redux |
| Bundled OpenAPI | _openapi_build/ | Merged API specifications |
| Command | Description |
|---|---|
make build | Full build: bundles OpenAPI + generates Go/TypeScript |
make bundle-openapi | Bundle and merge OpenAPI specs only |
make generate-golang | Generate Go code (requires bundled specs) |
make generate-ts | Generate TypeScript types and schemas |
npm run build | Build TypeScript distribution with tsup |
Schemas are discovered automatically by scanning schemas/constructs/ for directories containing an api.yml file. No manual configuration needed!
x-* Annotations)OpenAPI vendor extensions provide metadata that the Meshery build pipeline uses to control code generation behavior.
x-oapi-codegen-extra-tagsAdded to individual properties to inject custom Go struct tags into generated code. Commonly used for JSON, YAML, and database column mappings.
roleName:
type: string
x-oapi-codegen-extra-tags:
json: "role_name,omitempty"
yaml: "role_name,omitempty"
db: "role_name"
Do not add this to properties that already inherit it through a $ref to a core schema — the tags are already defined in the referenced definition.
x-go-type and x-go-type-importTells oapi-codegen to use a specific Go type for a property instead of generating a new struct. Use this for cross-package references and for complex field types like core.Map.
metadata:
type: object
additionalProperties: true
x-go-type: "core.Map"
x-go-type-skip-optional-pointer: true
x-oapi-codegen-extra-tags:
db: "metadata"
For cross-package references:
plan:
$ref: "../plan/api.yml#/components/schemas/Plan"
x-go-type: "planv1beta1.Plan"
x-go-type-import:
path: "github.com/meshery/schemas/models/v1beta1/plan"
name: planv1beta1
x-internalApplied to individual API operations (get, post, etc.) to scope them to a specific deployment target. The build pipeline uses this tag to split the merged OpenAPI spec into cloud_openapi.yml (for Meshery Cloud) and meshery_openapi.yml (for Meshery OSS).
paths:
/api/entitlement/plans:
get:
x-internal: ["cloud"] # Only included in the cloud bundle
operationId: getPlans
Operations without x-internal are included in all bundles.
x-generate-db-helpersx-generate-db-helpers: true is an optional, schema-level annotation placed on a named component under components/schemas (not on individual properties). It directs the Go generator to automatically produce Scan() and Value() SQL driver methods for that type in the auto-generated file zz_generated.helpers.go.
These methods implement Go’s sql.Scanner and driver.Valuer interfaces, allowing the struct to be transparently serialized as JSON when reading from or writing to a database column.
Use x-generate-db-helpers: true when both of the following are true:
Do not use x-generate-db-helpers for:
metadata object). Use x-go-type: "core.Map" for those fields instead.components:
schemas:
Quiz:
x-generate-db-helpers: true # schema-level annotation
type: object
required:
- id
- title
properties:
id:
$ref: "../../v1alpha1/core/api.yml#/components/schemas/uuid"
title:
type: string
# ... additional properties
The generator produces the following in zz_generated.helpers.go:
func (value *Quiz) Scan(src interface{}) error {
if src == nil {
*value = Quiz{}
return nil
}
mapVal := core.Map{}
if err := mapVal.Scan(src); err != nil {
return err
}
return core.MapToStruct(mapVal, value)
}
func (value Quiz) Value() (driver.Value, error) {
mapVal, err := core.StructToMap(value)
if err != nil {
return nil, err
}
return core.Map(mapVal).Value()
}
metadataA metadata field is also stored as a JSON blob in the database, but it is amorphous — it has no fixed property list. For this reason it uses x-go-type: "core.Map" rather than x-generate-db-helpers:
metadata:
type: object
additionalProperties: true
x-go-type: "core.Map"
x-go-type-skip-optional-pointer: true
x-oapi-codegen-extra-tags:
db: "metadata"
While Go structs are auto-generated from schemas, you often need to add custom methods to make these structs compatible with databases, implement interfaces, or add utility functions. This is done through manually created helper files.
Create a helper file (*_helper.go or helpers.go) in the generated package when you need:
| Use Case | Description |
|---|---|
| SQL Driver Compatibility | Implement database/sql/driver.Scanner and driver.Valuer interfaces (consider using x-generate-db-helpers instead for types with fixed schemas stored as JSON blobs) |
| Entity Interface | Implement the entity.Entity interface for database CRUD operations |
| GORM Table Names | Define custom table names via TableName() method |
| Utility Methods | Add helper functions for serialization, validation, or business logic |
| Type Conversions | Add methods to convert between related types |
models/
├── core/
│ ├── core.go # Auto-generated (do NOT edit)
│ ├── helpers.go # Manual: utility functions
│ ├── datatype_map.go # Manual: Map type with SQL driver methods
│ └── datatype_null_time.go # Manual: NullTime with SQL driver methods
├── v1beta1/
│ ├── model/
│ │ ├── model.go # Auto-generated (do NOT edit)
│ │ └── model_helper.go # Manual: Entity interface, TableName, etc.
│ ├── component/
│ │ ├── component.go # Auto-generated (do NOT edit)
│ │ └── component_helper.go # Manual: Entity interface, TableName, etc.
│ └── category/
│ ├── category.go # Auto-generated (do NOT edit)
│ └── category_helper.go # Manual: Entity interface, TableName, etc.
Tip : For types with a fixed schema that are stored as a JSON blob in a single database column, prefer the
x-generate-db-helpers: trueannotation on the schema component. This auto-generates theScanandValuemethods for you. Use manual helper files only when the auto-generated methods are insufficient (e.g., custom serialization logic is needed).
To store complex types (structs, maps, slices) in SQL databases, implement Scan and Value methods:
// helpers.go - This is NOT autogenerated
package mypackage
import (
"database/sql/driver"
"encoding/json"
"github.com/meshery/schemas/models/core"
)
// Scan implements sql.Scanner interface for reading from database
func (m *MyComplexType) Scan(value interface{}) error {
mapVal := core.Map{}
err := mapVal.Scan(value)
if err != nil {
return err
}
return core.MapToStruct(mapVal, m)
}
// Value implements driver.Valuer interface for writing to database
func (m MyComplexType) Value() (driver.Value, error) {
mapVal, err := core.StructToMap(m)
if err != nil {
return nil, err
}
return core.Map(mapVal).Value()
}
For structs that need database CRUD operations, implement the entity.Entity interface:
// component_helper.go - This is NOT autogenerated
package component
import (
"fmt"
"sync"
"github.com/gofrs/uuid"
"github.com/meshery/meshkit/database"
"github.com/meshery/meshkit/models/meshmodel/entity"
"gorm.io/gorm/clause"
)
// TableName returns the database table name for GORM
func (c ComponentDefinition) TableName() string {
return "component_definition_dbs"
}
// Type returns the entity type identifier
func (c ComponentDefinition) Type() entity.EntityType {
return entity.ComponentDefinition
}
// GenerateID generates a new UUID for the entity
func (c *ComponentDefinition) GenerateID() (uuid.UUID, error) {
return uuid.NewV4()
}
// GetID returns the entity's ID
func (c ComponentDefinition) GetID() uuid.UUID {
return c.Id
}
// GetEntityDetail returns a human-readable description
func (c *ComponentDefinition) GetEntityDetail() string {
return fmt.Sprintf("type: %s, name: %s, model: %s",
c.Type(), c.DisplayName, c.Model.Name)
}
// Create inserts the entity into the database
func (c *ComponentDefinition) Create(db *database.Handler, hostID uuid.UUID) (uuid.UUID, error) {
c.Id, _ = c.GenerateID()
err := db.Omit(clause.Associations).Create(&c).Error
return c.Id, err
}
// UpdateStatus updates the entity's status in the database
func (c *ComponentDefinition) UpdateStatus(db *database.Handler, status entity.EntityStatus) error {
return nil
}
For entities that need consistent IDs based on their content (to prevent duplicates):
// model_helper.go
package model
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"github.com/gofrs/uuid"
)
func (m *ModelDefinition) GenerateID() (uuid.UUID, error) {
// Create identifier from unique fields
modelIdentifier := ModelDefinition{
Registrant: m.Registrant,
Version: m.Version,
SchemaVersion: m.SchemaVersion,
Name: m.Name,
Model: Model{
Version: m.Model.Version,
},
}
byt, err := json.Marshal(modelIdentifier)
if err != nil {
return uuid.UUID{}, err
}
hash := md5.Sum(byt)
return uuid.FromString(hex.EncodeToString(hash[:]))
}
Add type aliases and conversion methods for convenience:
// model_helper.go
package model
// Type alias for cleaner code
type Styles = ComponentDefinition_Styles
// ToReference converts full definition to a lightweight reference
func (m ModelDefinition) ToReference() ModelReference {
return ModelReference{
Name: m.Name,
Version: m.Version,
DisplayName: m.DisplayName,
Model: m.Model,
Registrant: RegistrantReference{
Kind: m.Registrant.Kind,
},
}
}
The models/core/ package provides reusable types with built-in SQL compatibility:
| Type | Purpose | Use Case |
|---|---|---|
core.Map | map[string]any with SQL support | Storing JSON objects in database |
core.NullTime | Nullable time with JSON/YAML support | Optional timestamp fields (e.g., deleted_at) |
core.Time | Time wrapper with custom formatting | Required timestamp fields |
Using Core Types:
package mypackage
import "github.com/meshery/schemas/models/core"
// For nullable timestamps (e.g., deleted_at)
type MyStruct struct {
DeletedAt core.NullTime `json:"deleted_at" gorm:"column:deleted_at"`
}
// For JSON metadata stored as blob
type MyStruct struct {
Metadata core.Map `json:"metadata" gorm:"type:bytes;serializer:json"`
}
// This is not autogenerated. at the top.go files, helper files ARE committed to the repository<package>_helper.go or helpers.goimport { v1beta1, v1alpha1 } from "@meshery/schemas";
const component: v1beta1.Component = { /* ... */ };
const model: v1beta1.Model = { /* ... */ };
const design: v1beta1.Design = { /* ... */ };
// From main index
import {
ModelDefinitionV1Beta1OpenApiSchema,
ComponentDefinitionV1Beta1OpenApiSchema,
} from "@meshery/schemas";
// Direct import
import ModelSchema from "@meshery/schemas/dist/constructs/v1beta1/model/ModelSchema";
typescript/index.tsThe typescript/index.ts file is manually maintained and defines the public API surface. When adding new constructs:
.d.ts file*Schema.ts file// Type imports (no .d.ts extension)
import { components as MyPackageComponents } from "./generated/v1beta1/mypackage/MyPackage";
// Schema imports
import MyPackageV1Beta1Schema from "./generated/v1beta1/mypackage/MyPackageSchema";
// Export in namespace
export namespace v1beta1 {
export type MyPackage = MyPackageComponents["schemas"]["MyPackage"];
}
// Export schema
export { MyPackageV1Beta1Schema };
Always use the non-deprecated references from v1alpha1/core/api.yml:
| Type | Reference |
|---|---|
| UUID | ../../v1alpha1/core/api.yml#/components/schemas/uuid |
| Timestamp (created) | ../../v1alpha1/core/api.yml#/components/schemas/created_at |
| Timestamp (updated) | ../../v1alpha1/core/api.yml#/components/schemas/updated_at |
| Version String | ../../v1alpha1/core/api.yml#/components/schemas/versionString |
| Semver String | ../../v1alpha1/core/api.yml#/components/schemas/semverString |
| Input String | ../../v1alpha1/core/api.yml#/components/schemas/inputString |
properties:
createdAt:
$ref: ../../v1alpha1/core/api.yml#/components/schemas/created_at
x-order: 14
updatedAt:
$ref: ../../v1alpha1/core/api.yml#/components/schemas/updated_at
x-order: 15
x-orderUse the x-order tag to ensure fields appear in a specific order in generated code:
properties:
id:
type: string
x-order: 1
name:
type: string
x-order: 2
description:
type: string
x-order: 3
When referencing models or other constructs, add x-go-type and x-go-import-path to avoid generating redundant Go structs:
model:
$ref: ../model/api.yml#/components/schemas/ModelReference
x-go-type: model.ModelReference
x-go-type-import:
path: github.com/meshery/schemas/models/v1beta1/model
description: Reference to the model
Use x-internal to control which bundled output includes the path:
paths:
/api/entitlement/plans:
get:
x-internal: ["cloud"] # Only included in cloud_openapi.yml
operationId: getPlans
# ...
x-internal : Included only in the specified clientsx-internal : Included in all clientsTemplates are manually defined files in the templates/ subdirectory. They provide example instances with default values.
constructs/v1beta1/model/templates/
├── model_template.json # Default JSON template
├── model_template.yaml # Default YAML template
├── model_minimal_template.json # Minimal variant (optional)
└── model_full_template.yaml # Full variant (optional)
{
"id": "00000000-0000-0000-0000-000000000000",
"schemaVersion": "models.meshery.io/v1beta1",
"version": "1.0.0",
"name": "example-model",
"displayName": "Example Model",
"description": "An example model template",
"created_at": "0001-01-01T00:00:00Z",
"updated_at": "0001-01-01T00:00:00Z"
}
CRITICAL : Do not commit generated files. Only commit source schema files.
| Directory/File | Description |
|---|---|
models/<version>/<package>/<package>.go | Auto-generated Go structs |
typescript/generated/ | Generated TypeScript types and schemas |
dist/ | Built distribution files |
_openapi_build/ | Bundled OpenAPI specs |
merged_openapi.yml | Generated merged spec |
cloud_openapi.yml | Generated cloud spec |
meshery_openapi.yml | Generated meshery spec |
| Directory/File | Description |
|---|---|
constructs/<version>/<package>/api.yml | Index file for each construct |
constructs/<version>/<package>/*.yaml | Subschema files |
constructs/<version>/<package>/*.json | Schema files in JSON format |
constructs/<version>/<package>/templates/ | Template files |
typescript/index.ts | Manually maintained public API |
models/<version>/<package>/*_helper.go | Manual Go helper files (SQL drivers, Entity interface) |
models/<version>/<package>/helpers.go | Manual Go utility functions |
models/core/datatype_*.go | Manual Core data type definitions |
Note : The
models/directory contains both auto-generated files (e.g.,model.go) and manually created helper files (e.g.,model_helper.go). Only the auto-generated struct files should NOT be committed. Helper files that implement interfaces, SQL drivers, and utility methods ARE committed and maintained manually.
make build
npm run build
go test ./...
# Check Go code compiles
go build ./...
# Check TypeScript compiles
npm run build
models/<pkg>/<pkg>.go) - but DO commit helper filescore.json references instead of v1alpha1/core/api.ymlx-oapi-codegen-extra-tags when using core schema referencestemplates/ subdirectory.d.ts extension in TypeScript import pathstypescript/index.ts for public API exposurex-go-type when referencing other constructs.go files instead of creating helper files// This is not autogenerated. comment in helper filesTableName() method in helper files for GORM entitiesScan()/Value() for complex types stored in SQLScan()/Value() methods when x-generate-db-helpers: true on the schema component would auto-generate themx-generate-db-helpers on amorphous types (use x-go-type: "core.Map" instead)Before submitting a PR, verify:
api.yml as the index file if adding new constructapi.ymlv1alpha1/core/api.yml referencesx-oapi-codegen-extra-tags when using core refsx-generate-db-helpers: true for types with fixed schemas stored as JSON blobs*_helper.go) only for cases not covered by auto-generation// This is not autogenerated. comment to helper filesTableName(), Scan(), Value() as needed in helper filessync.Mutex for thread-safe Create() methodsx-order tags for consistent field orderingmake build successfullygo test ./... successfullynpm run build successfullytypescript/index.ts if adding new public typesa. Add a new schema on a new command
Example: You want to add a mesheryctl model build command. Steps:
openapi.yaml under the appropriate construct (e.g., model/)<construct>.json if new properties are neededmake generate-types
make golang-generate
b. Add an existing schema on an existing command
Example : You detect a part of existing code that is not following the schema driven development principle (model is a struct created in mesheryctl command), you have two options:
If you know how to implement, update the existing code to use a proper struct generated from the meshery/schemas repository
If you don’t know how to implement it, open an issue on Github using either a mesheryctl issue template (feature, bug)
c. Add a new schema on an existing command
Steps:
openapi.yaml under the appropriate construct (e.g., model/)<construct>.json if new properties are neededmake generate-types
make golang-generate
Why it matters: This reduces drift between backend logic and API contract, enforces consistency between Meshery’s components (Server, UI, CLI) and , resulting in higher quality code.
Example: Add a new status field to component. Steps:
component.jsonmake validate-schemas
make golang-generate
oapi-codegen) are used in the backend.Why it matters: This reduces drift between backend logic and API contract, enforces consistency between Meshery’s components (Server, UI, CLI) and , resulting in higher quality code.
Example: Show the new version field on the Model dashboard. Steps:
openapi.yaml to verify the new field existsNote :
make generate-typesnow generates only TypeScript types and schema-related objects._template.json/_template.yamlfiles are no longer auto-generated.
Why it matters: UI stays in sync with the backend - fewer bugs, fewer mismatches, easier onboarding.
Example: You are writing a guide! Steps:
Why it matters: Docs are often the first impression contributors get. Schema-driven clarity starts here.
x-generate-db-helpersCommunity Resources For more contribution guidelines, see the Meshery Contributing Guide.
[ Previous
Model Relationships ](/v0.9/project/contributing/contributing-relationships)[ Next
Dev Setup on Windows ](/v0.9/project/contributing/meshery-windows)