Skip to content

Schema v3 Recipe Authoring Guide

This guide covers the complete JSON schema for creating custom Asset Scaffolding recipes. Schema v3 introduces powerful features like parameters, presets, conditional sections, and recipe inheritance.

Schema Overview

{
  "schema_version": 3,
  "id": "unique_recipe_id",
  "display_name": "Human Readable Name",
  "description": "What this recipe creates",

  // Metadata
  "author": "Your Name",
  "version": "1.0.0",
  "category": "Gameplay",
  "tags": ["blueprint", "character"],

  // Customization (Schema v3)
  "parameters": [...],
  "presets": [...],

  // Asset definition
  "asset_type": "Blueprint",
  "asset_subtype": "Character",
  "expected_path": "/Game/Blueprints/{{Name}}",

  // Blueprint contents
  "components": [...],
  "variables": [...],
  "functions": [...],
  "interfaces": [...],
  "event_graph": [...]
}

Core Fields

Identification

Field Type Required Description
schema_version int Yes Must be 3 for Schema v3
id string Yes Unique identifier (lowercase, underscores)
display_name string Yes Human-readable name shown in UI
description string Yes What the recipe creates

Metadata

Field Type Required Description
author string No Recipe author name
version string No Semantic version (default: "1.0.0")
category string Yes Category for organization
pack_id string No Recipe pack (fps_pack, rpg_pack, etc.)
tags string[] No Searchable tags
is_curated bool No Official BrahmaForge recipe
is_template bool No Base recipe for inheritance only
is_deprecated bool No Mark as deprecated

Asset Definition

Field Type Required Description
asset_type string Yes Blueprint, WidgetBlueprint, Material, DataAsset, etc.
asset_subtype string No For Blueprints: Actor, Character, Pawn, etc.
parent_class string No Parent class path for custom inheritance
expected_path string No Suggested output path (supports {{Param}})

Parameters

Parameters make recipes customizable. Users can adjust values when scaffolding.

Parameter Definition

{
  "parameters": [
    {
      "name": "CharacterName",
      "type": "string",
      "default": "MyCharacter",
      "description": "Name for the character",
      "required": true,
      "group": "Identity"
    },
    {
      "name": "MaxHealth",
      "type": "float",
      "default": "100.0",
      "min": 1,
      "max": 100000,
      "description": "Maximum health points",
      "group": "Stats"
    },
    {
      "name": "CharacterType",
      "type": "enum",
      "default": "Player",
      "options": ["Player", "NPC", "Enemy"],
      "description": "Type of character",
      "group": "Identity"
    },
    {
      "name": "CanSprint",
      "type": "bool",
      "default": "true",
      "description": "Enable sprinting",
      "group": "Abilities"
    }
  ]
}

Parameter Types

Type Description Additional Fields
string Text value validation_regex
int Integer number min, max
float Decimal number min, max
bool true/false -
enum Selection from options options (required)
asset_ref Asset reference asset_class

Parameter Fields

Field Type Required Description
name string Yes Parameter name (use in templates as {{Name}})
type string Yes One of: string, int, float, bool, enum, asset_ref
default string Yes Default value (as string)
description string No Shown in UI
required bool No Must be provided (default: true)
group string No UI grouping
min number No Minimum value (numeric types)
max number No Maximum value (numeric types)
options string[] Enum only Valid enum values
validation_regex string No Regex pattern for string validation

Presets

Presets are pre-configured parameter combinations for quick scaffolding.

{
  "presets": [
    {
      "name": "ThirdPerson_Player",
      "description": "Standard third-person player character",
      "values": {
        "CharacterName": "Player",
        "CharacterType": "Player",
        "MaxHealth": "100",
        "WalkSpeed": "600",
        "HasCamera": "true",
        "CameraStyle": "ThirdPerson"
      },
      "tags": ["player", "third-person"]
    },
    {
      "name": "Basic_Enemy",
      "description": "Basic enemy character",
      "values": {
        "CharacterName": "Enemy",
        "CharacterType": "Enemy",
        "MaxHealth": "50",
        "HasCamera": "false"
      },
      "tags": ["enemy", "ai", "combat"]
    }
  ]
}

Preset Fields

Field Type Required Description
name string Yes Preset identifier
description string No What this preset creates
values object Yes Parameter value overrides
tags string[] No Searchable tags
thumbnail_path string No Preview image path

Template Expressions

Use {{ParameterName}} syntax to insert parameter values anywhere in the recipe.

In Expected Path

{
  "expected_path": "/Game/Blueprints/Characters/BP_{{CharacterName}}"
}

In Component Properties

{
  "components": [
    {
      "class": "CharacterMovementComponent",
      "name": "CharacterMovement",
      "properties": {
        "MaxWalkSpeed": "{{WalkSpeed}}",
        "JumpZVelocity": "{{JumpHeight}}"
      }
    }
  ]
}

In Variable Defaults

{
  "variables": [
    {
      "name": "MaxHealth",
      "type": "float",
      "default": "{{MaxHealth}}"
    }
  ]
}

Enum Mapping

Map enum parameter values to different output values:

{
  "properties": {
    "Mobility": "{{CanMove:true=Movable,false=Static}}"
  }
}

Components

Define Blueprint components to add.

{
  "components": [
    {
      "class": "CapsuleComponent",
      "name": "CapsuleComponent",
      "is_root": true,
      "properties": {
        "CapsuleHalfHeight": "96",
        "CapsuleRadius": "42"
      }
    },
    {
      "class": "SkeletalMeshComponent",
      "name": "Mesh",
      "attach_to": "CapsuleComponent"
    },
    {
      "class": "SpringArmComponent",
      "name": "CameraBoom",
      "attach_to": "CapsuleComponent",
      "condition": "{{HasCamera}} == true",
      "properties": {
        "TargetArmLength": "{{CameraArmLength}}",
        "bUsePawnControlRotation": "true"
      }
    },
    {
      "class": "CameraComponent",
      "name": "FollowCamera",
      "attach_to": "CameraBoom",
      "attach_socket": "CameraSocket",
      "condition": "{{HasCamera}} == true"
    }
  ]
}

Component Fields

Field Type Required Description
class string Yes UE component class name
name string Yes Instance name
is_root bool No Set as root component
attach_to string No Parent component name
attach_socket string No Socket name for attachment
properties object No Property key-value overrides
condition string No Include only if condition is true

Conditional Components

Use the condition field to include components based on parameter values:

{
  "class": "AIPerceptionComponent",
  "name": "AIPerception",
  "condition": "{{UsePerception}} == true"
}

Supported operators: ==, !=, >, <, >=, <=

Combine conditions: {{A}} == true && {{B}} > 0

Variables

Define Blueprint variables.

{
  "variables": [
    {
      "name": "MaxHealth",
      "type": "float",
      "default": "{{MaxHealth}}",
      "category": "Stats",
      "tooltip": "Maximum health points",
      "exposed": true
    },
    {
      "name": "CurrentHealth",
      "type": "float",
      "default": "{{MaxHealth}}",
      "category": "Stats",
      "replicated": true,
      "replication_condition": "COND_OwnerOnly"
    },
    {
      "name": "InventoryItems",
      "type": "object",
      "object_class": "InventoryItem",
      "is_array": true,
      "category": "Inventory"
    },
    {
      "name": "TeamColor",
      "type": "struct",
      "struct_type": "LinearColor",
      "default": "(R=1,G=0,B=0,A=1)",
      "category": "Team"
    }
  ]
}

Variable Fields

Field Type Required Description
name string Yes Variable name
type string Yes Type (see table below)
default string No Default value
category string No Category in Details panel
tooltip string No Description tooltip
exposed bool No Blueprint editable (default: true)
read_only bool No Read-only in editor
replicated bool No Network replicated
replication_condition string No COND_None, COND_InitialOnly, COND_OwnerOnly
is_array bool No Make array type
struct_type string Struct only Struct name (Vector, LinearColor, etc.)
object_class string Object only Object class path

Variable Types

Type Description Example Default
bool Boolean "false"
int Integer "0"
float Float "0.0"
text FText "Hello"
string FString "World"
name FName "None"
struct Struct Depends on struct_type
object Object reference "None"

Functions

Define Blueprint functions and events.

{
  "functions": [
    {
      "name": "TakeDamage",
      "is_event": true,
      "category": "Damage",
      "tooltip": "Handle incoming damage",
      "stub_implementation": "subtract_health_and_check_death",
      "inputs": [
        { "name": "DamageAmount", "type": "float" },
        { "name": "DamageEvent", "type": "struct", "struct_type": "DamageEvent" },
        { "name": "EventInstigator", "type": "object", "object_class": "Controller" }
      ],
      "outputs": [
        { "name": "ActualDamage", "type": "float" }
      ]
    },
    {
      "name": "GetHealthPercent",
      "category": "Stats",
      "is_pure": true,
      "outputs": [
        { "name": "Percent", "type": "float" }
      ]
    },
    {
      "name": "Heal",
      "category": "Stats",
      "blueprint_callable": true,
      "access_specifier": "Public",
      "inputs": [
        { "name": "HealAmount", "type": "float" }
      ]
    }
  ]
}

Function Fields

Field Type Required Description
name string Yes Function name
category string No Category in Blueprint
tooltip string No Description
is_event bool No Is this an event (BeginPlay, Tick, etc.)
is_pure bool No Pure function (no side effects)
blueprint_callable bool No Callable from Blueprint (default: true)
access_specifier string No Public, Protected, Private
stub_implementation string No Implementation hint
inputs array No Input parameters
outputs array No Output parameters

Interfaces

Implement Blueprint interfaces.

{
  "interfaces": [
    {
      "path": "/Script/Engine.GenericTeamAgentInterface"
    },
    {
      "path": "/Game/Interfaces/BPI_Interactable",
      "functions_to_implement": ["OnInteract", "GetInteractionText"]
    }
  ]
}

Event Graph

Define starter event graph nodes.

{
  "event_graph": [
    {
      "event": "BeginPlay",
      "nodes": ["InitializeHealth", "SetupMovement"],
      "comment": "Character initialization"
    },
    {
      "event": "SetupPlayerInputComponent",
      "nodes": ["BindMoveActions", "BindJumpAction"],
      "comment": "Input binding"
    }
  ]
}

Widget Blueprints

For WidgetBlueprint recipes, use root_widget to define the widget hierarchy.

{
  "asset_type": "WidgetBlueprint",
  "expected_path": "/Game/UI/WBP_{{HUDName}}",

  "root_widget": {
    "name": "RootCanvas",
    "class": "CanvasPanel",
    "children": [
      {
        "name": "HealthContainer",
        "class": "HorizontalBox",
        "children": [
          {
            "name": "HealthBar",
            "class": "ProgressBar",
            "is_variable": true,
            "style": {
              "min_width": 200,
              "min_height": 20,
              "background_color": [0.1, 0.1, 0.1, 0.85]
            }
          },
          {
            "name": "HealthText",
            "class": "TextBlock",
            "default_text": "100/100",
            "is_variable": true
          }
        ]
      }
    ]
  }
}

Widget Classes

Common widget classes: - CanvasPanel - Root canvas - VerticalBox - Vertical layout - HorizontalBox - Horizontal layout - Border - Background/border container - Button - Clickable button - TextBlock - Text display - Image - Image display - ProgressBar - Progress indicator - Spacer - Layout spacer

Widget Style

{
  "style": {
    "background_color": [0.1, 0.1, 0.1, 0.85],
    "hover_color": [0.18, 0.18, 0.18, 0.9],
    "pressed_color": [0.08, 0.08, 0.08, 0.9],
    "text_color": [1, 1, 1, 1],
    "font_size": 16,
    "text_justification": "Center",
    "padding": 4,
    "min_width": 100,
    "min_height": 40
  }
}

Recipe Inheritance

Extend existing recipes with extends_recipe.

{
  "schema_version": 3,
  "id": "fps_character",
  "display_name": "FPS Character",
  "extends_recipe": "character_blueprint",

  "parameters": [
    {
      "name": "HasWeapon",
      "type": "bool",
      "default": "true",
      "group": "Combat"
    }
  ],

  "components": [
    {
      "class": "SkeletalMeshComponent",
      "name": "ArmsMesh",
      "attach_to": "FollowCamera"
    }
  ]
}

Inherited recipes: - Merge parameters (child overrides parent) - Merge components (child adds to parent) - Merge variables and functions - Override metadata

Dependencies

Declare required plugins or classes.

{
  "dependencies": [
    {
      "type": "plugin",
      "name": "EnhancedInput",
      "optional": false
    },
    {
      "type": "class",
      "name": "/Script/AIModule.AIController"
    },
    {
      "type": "recipe",
      "name": "blackboard_data",
      "optional": true
    }
  ]
}

Conditions

Platform or configuration-based inclusion.

{
  "conditions": [
    {
      "type": "plugin",
      "key": "EnhancedInput",
      "value": "enabled"
    },
    {
      "type": "platform",
      "key": "Windows",
      "value": "true"
    }
  ]
}

Complete Example

Here's a complete character recipe demonstrating all Schema v3 features:

{
  "schema_version": 3,
  "id": "my_character",
  "display_name": "My Custom Character",
  "description": "A fully customizable character blueprint",
  "author": "Your Name",
  "version": "1.0.0",
  "category": "Gameplay",
  "tags": ["character", "player", "custom"],

  "parameters": [
    {
      "name": "Name",
      "type": "string",
      "default": "Player",
      "required": true,
      "group": "Identity"
    },
    {
      "name": "Health",
      "type": "float",
      "default": "100",
      "min": 1,
      "max": 10000,
      "group": "Stats"
    },
    {
      "name": "HasCamera",
      "type": "bool",
      "default": "true",
      "group": "Features"
    }
  ],

  "presets": [
    {
      "name": "Default_Player",
      "description": "Standard player",
      "values": {
        "Name": "Player",
        "Health": "100",
        "HasCamera": "true"
      }
    }
  ],

  "asset_type": "Blueprint",
  "asset_subtype": "Character",
  "expected_path": "/Game/Characters/BP_{{Name}}",

  "components": [
    {
      "class": "CapsuleComponent",
      "name": "Capsule",
      "is_root": true
    },
    {
      "class": "CameraComponent",
      "name": "Camera",
      "attach_to": "Capsule",
      "condition": "{{HasCamera}} == true"
    }
  ],

  "variables": [
    {
      "name": "MaxHealth",
      "type": "float",
      "default": "{{Health}}",
      "exposed": true
    }
  ],

  "functions": [
    {
      "name": "TakeDamage",
      "is_event": true,
      "inputs": [
        { "name": "Amount", "type": "float" }
      ]
    }
  ]
}

Best Practices

  1. Use Descriptive IDs: fps_character not char1
  2. Group Parameters: Use the group field for UI organization
  3. Provide Presets: Give users quick-start options
  4. Document Everything: Use description and tooltip fields
  5. Test Conditions: Verify conditional components work correctly
  6. Version Your Recipes: Update version when making changes
  7. Use Tags: Make recipes discoverable with relevant tags

Validation

Use Studio Mode to validate recipes before use: - Schema version check - Required field validation - Parameter type checking - Component class verification - Condition syntax validation


Schema v3 Documentation - Asset Scaffolding Plugin © 2026 BrahmaForge. All rights reserved.