Skip to content

JSON Schema

Structyl provides a JSON Schema for IDE autocomplete and validation.

Using the Schema

Add the schema reference to your .structyl/config.json:

json
{
  "$schema": "https://structyl.akinshin.dev/schema/config.json",
  "project": {
    "name": "my-library"
  }
}

Or use a local path:

json
{
  "$schema": "./schema/config.schema.json",
  "project": {
    "name": "my-library"
  }
}

Download

Download the schema: config.schema.json

IDE Support

VS Code

VS Code automatically uses the $schema reference for:

  • Autocomplete suggestions
  • Error highlighting
  • Hover documentation

JetBrains IDEs

IntelliJ, WebStorm, and other JetBrains IDEs support JSON Schema via the $schema field.

Vim/Neovim

With coc.nvim or nvim-lspconfig, JSON schemas are automatically applied.

Schema vs Runtime Validation

The JSON Schema is for IDE assistance. Structyl's runtime validation is more lenient:

AspectJSON Schema (IDE)Runtime (Structyl)
Unknown fieldsMay rejectIgnored with warning
PurposeEditor assistanceExecution
StrictnessFull validationRequired fields only

This design allows newer configurations to work with older IDE schemas while maintaining forward compatibility.

Configuration Reference

The full configuration structure:

json
{
  "$schema": "https://structyl.akinshin.dev/schema/config.json",

  "project": {
    "name": "string (required)",
    "description": "string",
    "homepage": "string (URL)",
    "repository": "string (URL)",
    "license": "string (SPDX identifier)"
  },

  "version": {
    "source": "string (default: .structyl/PROJECT_VERSION)",
    "files": [
      {
        "path": "string (required)",
        "pattern": "string (required, regex)",
        "replace": "string (required)",
        "replace_all": "boolean (default: false)"
      }
    ]
  },

  "targets": {
    "<slug>": {
      "type": "language | auxiliary",
      "title": "string (required)",
      "toolchain": "string",
      "directory": "string",
      "cwd": "string",
      "commands": {
        "<command>": "string | array | null"
      },
      "vars": { "<key>": "string" },
      "env": { "<key>": "string" },
      "depends_on": ["string"]
    }
  },

  "toolchains": {
    "<name>": {
      "extends": "string",
      "commands": { "<command>": "string" }
    }
  },

  "tests": {
    "directory": "string (default: tests)",
    "pattern": "string (default: **/*.json)",
    "comparison": {
      "float_tolerance": "number (default: 1e-9)",
      "tolerance_mode": "absolute | relative | ulp",
      "array_order": "strict | unordered",
      "nan_equals_nan": "boolean (default: true)"
    }
  },

  "docker": {
    "compose_file": "string",
    "env_var": "string (default: STRUCTYL_DOCKER)",
    "services": {
      "<target>": {
        "base_image": "string",
        "dockerfile": "string",
        "platform": "string"
      }
    }
  }
}

Complete Schema

This reference shows the most common configuration fields. For the complete schema including mise, release, ci, and artifacts sections, see the JSON Schema file.

Command Value Types

Commands support three value types:

  • string: A shell command to execute (e.g., "go build ./...")
  • array: A list of command references to execute in sequence (e.g., ["clean", "build"])
  • null: Explicitly disables the command for this target

Object-form commands (with per-command cwd, env, etc.) are reserved for future use and currently rejected.

Required Fields

Only project.name is required. All other fields have sensible defaults.

Minimal valid configuration:

json
{
  "project": {
    "name": "my-library"
  }
}

© 2026 Andrey Akinshin MIT