Skip to main content
To keep things simple, we’ve provided a getting-started repository that contains everything you need to create a release. Follow along with us by cloning the repository.
git clone https://github.com/mirurobotics/getting-started.git

Define the schemas

Releases are primarily defined by the config schemas they contain. The getting-started repository contains two sets of schemas for each of the supported schema languages:
  • Empty schemas - regard all config instances as valid
  • Strict schemas - constrain the valid fields, types, and values for instances of the config type they belong to
For this tutorial, choose one of these schema sets to create your release with. If you’re unfamiliar with schema languages, we recommend starting with JSON Schema. If you don’t currently use a schema, we recommend starting with an empty schema and gradually adding constraints as needed.
Empty Schemas
x-miru-config-type: "communication"
$schema: "http://json-schema.org/draft/2020-12/schema"
Strict Schemas
x-miru-config-type: "communication"
$schema: "http://json-schema.org/draft/2020-12/schema"
type: object
required:
    - control_loop_rate_hz
    - watchdog_timeout_ms
    - network
    - logging
    - error_handling
properties:
    control_loop_rate_hz:
    type: integer
    description: Control loop frequency in Hertz
    minimum: 1
    maximum: 1000  
    default: 50
    watchdog_timeout_ms:
    type: integer
    description: Watchdog timeout duration in milliseconds
    minimum: 100   
    maximum: 5000  
    default: 500
    network:
    type: object
    required:
        - max_latency_ms
        - connection_timeout_ms
        - reconnect_attempts
        - reconnect_interval_ms
        - heartbeat_interval_ms
    properties:
        max_latency_ms:
        type: integer
        description: Maximum acceptable network latency in milliseconds
        minimum: 10    
        maximum: 1000  
        default: 100
        connection_timeout_ms:
        type: integer
        description: Connection timeout duration in milliseconds
        minimum: 100    
        maximum: 10000  
        default: 2000
        reconnect_attempts:
        type: integer
        description: Number of reconnection attempts
        minimum: 1
        maximum: 10    
        default: 3
        reconnect_interval_ms:
        type: integer
        description: Interval between reconnection attempts in milliseconds
        minimum: 100    
        maximum: 5000   
        default: 1000
        heartbeat_interval_ms:
        type: integer
        description: Interval between heartbeat messages in milliseconds
        minimum: 50     
        maximum: 1000   
        default: 250
    logging:
    type: object
    required:
        - enable_packet_logging
        - log_level
        - max_log_size_mb
        - retain_logs_days
    properties:
        enable_packet_logging:
        type: boolean
        description: Enable or disable packet logging
        default: true
        log_level:
        type: string
        description: Logging level
        enum: ["debug", "info", "warn", "error"]
        default: "info"
        max_log_size_mb:
        type: integer
        description: Maximum log file size in megabytes
        minimum: 1
        maximum: 1024  
        default: 100
        retain_logs_days:
        type: integer
        description: Number of days to retain log files
        minimum: 1
        maximum: 90    
        default: 30
    error_handling:
    type: object
    required:
        - max_consecutive_failures
        - failure_timeout_ms
        - enable_auto_recovery
    properties:
        max_consecutive_failures:
        type: integer
        description: Maximum number of consecutive failures allowed
        minimum: 1
        maximum: 20    
        default: 5
        failure_timeout_ms:
        type: integer
        description: Timeout duration for failure handling in milliseconds
        minimum: 100    
        maximum: 30000  
        default: 5000
        enable_auto_recovery:
        type: boolean
        description: Enable or disable automatic recovery from failures
        default: true

Create the config types

To be able to push the schemas to Miru, we must first create config types to house them. We’ll start with the Mobility config type. Navigate to the config types page.
Click the New Config Type button, supply the name Mobility and slug mobility, and click Create.
The provided slug is a unique identifier for the config type—it’s how the CLI determines which config type a schema belongs to. As such, config schemas must be annotated with the slug of the config type to which they belong.
x-miru-config-type: "mobility"
The getting-started repository already annotates the schemas with the appropriate slugs, so no need to add them yourself. After creating the Mobility config type, repeat this process for the Communication and Planning config types, using the slugs communication and planning respectively.

Set up the CLI

Next, we’ll install the CLI—the primary method of creating releases in Miru. This is a deliberate design choice. We believe a release’s schemas should live in a Git repository. This allows them to be versioned alongside the code that uses them and encourages better software development practices. While this tutorial covers creating releases on your local machine, the CLI can also be used to create releases in a CI pipeline.

Install

To install the Miru CLI, run the installation command in your local machine’s terminal.
curl -fsSL https://raw.githubusercontent.com/mirurobotics/cli/main/install.sh | sh
The script requires curl, tar, grep, and cut to be installed. Review the contents of the installation script here.
The Miru CLI supports macOS and Linux. Windows is not supported.

Login

To log in, run the login command.
miru login
Retrieve your authentication token from the Secrets page.
You must be an user to retrieve an authentication token.
Paste the token into the CLI.
Please retrieve your authentication token from the following URL:
🔗 https://app.mirurobotics.com/settings/cli-token

🔑 Paste your authentication token: **********

Validating authentication token...
✅ Successfully logged in as Benjamin

Create a release

With the CLI setup, we are ready to create a release in Miru. Navigate to the root of the getting-started repository and create the release with a schema set of your choice.
miru release create \
  --version "v1.0.0" \
  --schemas ./jsonschema/empty-schemas/
Upon a successful creation, you’ll see a confirmation message similar to the following:
$ miru release create \
  --version v1.0.0 \
  --schemas ./{schema-language}/{schema-type}/

 Creating release v1.0.0

 Pushed git commit (new)
    1c7f7a8 · miruml/getting-started

 Pushing schemas
 Mobility · SCH-D5nFP (new)
 Planning · SCH-37QAr (new)
 Communication · SCH-9WfCx (new)

 Created release v1.0.0
Git metadata is pulled from the local Git repository that the schemas are defined in.
To view the release in Miru, navigate to the releases page and click into the release.
Then select the overview tab at the top of the page to view the release’s details.
For a more comprehensive guide on creating releases, visit the create releases documentation. For a concise reference of the CLI command, visit the CLI Reference.
Last modified on February 12, 2026