Job templates

A job template is a JSON file that tells MinRender how to launch a DCC’s command-line renderer. It defines the executable, the argument structure, how to parse progress from stdout, and sensible defaults for the submission form.

Templates live in {farm}/templates/. Example templates ship in {farm}/templates/examples/ and are overridden by user templates with the same template_id.


Minimal example

{
    "_version": 1,
    "template_id": "blender-5.0",
    "name": "Blender 5.0",

    "cmd": {
        "windows": "C:/Program Files/Blender Foundation/Blender 5.0/blender.exe",
        "linux": "/usr/bin/blender",
        "macos": "/Applications/Blender.app/Contents/MacOS/Blender",
        "label": "Blender Executable",
        "editable": true
    },

    "flags": [
        { "flag": "-b", "value": null, "info": "Background mode" },
        { "flag": "", "value": "", "info": "Scene File", "editable": true, "required": true, "type": "file", "filter": "blend" },
        { "flag": "-o", "value": null, "info": "Output path flag" },
        { "flag": "", "value": "", "info": "Output Path", "editable": true, "required": true, "type": "output" },
        { "flag": "-s", "value": null },
        { "flag": "", "value": "{chunk_start}" },
        { "flag": "-e", "value": null },
        { "flag": "", "value": "{chunk_end}" },
        { "flag": "-a", "value": null, "info": "Render animation" }
    ],

    "job_defaults": { "frame_start": 1, "frame_end": 100, "chunk_size": 10 },
    "progress": { "patterns": [], "error_patterns": [] },
    "output_detection": { "stdout_regex": null, "validation": "exit_code_only" },
    "process": { "working_dir": null },
    "environment": {},
    "tags_required": ["blend"]
}

This produces a command line like:

blender.exe -b scene.blend -o //output/path -s 1 -e 10 -a

Top-level fields

Field Type Description
_version int Always 1. Reserved for future schema changes.
template_id string Unique identifier. Used to match user templates against examples.
name string Display name shown in the submission UI.
cmd object Executable paths per OS (see below).
flags array Ordered list of command-line arguments (see below).
frame_padding string Frame number format used in default_pattern tokens. e.g. "####" (Blender), "[####]" (After Effects).
job_defaults object Pre-fills the submission form (see below).
progress object Regex patterns for parsing DCC stdout (see below).
output_detection object How to find rendered file paths in stdout (see below).
process object Process control settings (see below).
environment object Extra environment variables passed to the DCC process. Key-value string pairs.
tags_required string[] Nodes must have ALL of these tags to be eligible for this template’s jobs.

cmd — executable

Defines the DCC executable path for each operating system.

"cmd": {
    "windows": "C:/Program Files/Blender Foundation/Blender 5.0/blender.exe",
    "linux": "/usr/bin/blender",
    "macos": "/Applications/Blender.app/Contents/MacOS/Blender",
    "label": "Blender Executable",
    "editable": true
}
Field Type Description
windows string Path on Windows.
linux string Path on Linux.
macos string Path on macOS.
label string Label shown in the submission UI.
editable bool If true, the user can change the path at submission time.

At least one OS path must be non-empty. Leave unsupported platforms as "".


flags[] — command-line arguments

The flags array is the core of the template. It’s an ordered list that defines every argument passed to the DCC. MinRender reads it top to bottom and builds the command line in order.

How flags map to arguments

Each entry can produce a flag name, a value, or both:

flag value What it produces Use case
"-b" null -b Standalone switch
"-F" "EXR" -F EXR Flag with a fixed value
"" "scene.blend" scene.blend Positional argument
"-o" null -o Flag name only (value is the next entry)

The common pattern is a flag/value pair across two entries: a non-editable flag name (e.g. -o with value: null) followed by an editable positional value (e.g. flag: "" with the user-provided path). This keeps the flag name fixed while letting the user fill in the value.

Flag entry fields

Field Type Default Description
flag string   The flag name (e.g. "-b", "-o"). Empty string "" for positional arguments.
value string? null The value. null = no value (standalone flag). "" = user fills in. Any string = fixed or runtime token.
info string "" Label shown in the submission UI.
editable bool false Whether the user can modify this value at submission time.
required bool false If true and editable, submission fails when left empty.
type string "" "file" = shows a file picker. "output" = output path (used for output directory tracking and local staging). "" = plain text input.
filter string "" File extension filter for the file picker (e.g. "blend", "c4d", "aep"). Only relevant when type is "file".
id string "" Identifier for cross-referencing. Other flags’ default_pattern can reference this value via {flag:id}.
default_pattern string? null Auto-resolve pattern for the value. Evaluated at submission time (see Pattern tokens below).

Skipping empty optional flags

If a non-required editable positional value is left empty by the user, both it and its preceding standalone flag are omitted from the final command line. This lets templates include optional flags (like -take in Cinema 4D) that disappear cleanly when unused.

Runtime tokens

These tokens in flag values are replaced at dispatch time with the actual frame range for the chunk:

Token Replaced with
{chunk_start} First frame of the chunk
{chunk_end} Last frame of the chunk
{frame} Alias for {chunk_start}

Pattern tokens (for default_pattern)

These are resolved once at submission time to auto-fill output paths:

Token Source
{project_dir} Parent directory of the first type: "file" flag’s value
{file_name} Filename stem of the first type: "file" flag’s value
{frame_pad} The template’s frame_padding value (e.g. ####)
{flag:some_id} Value of the flag with "id": "some_id"
{date:YYYYMMDD} Current date
{date:YYYY}, {date:MM}, {date:DD} Year, month, day
{time:HHmm}, {time:HH}, {time:mm} Time

Example: a Blender output default_pattern:

{project_dir}\..renders\{file_name}\{file_name}_{frame_pad}

With a scene file at D:\projects\shot01\shot01.blend, this resolves to:

D:\projects\renders\shot01\shot01_####

job_defaults — submission defaults

Pre-fills the submission form. Users can override all of these.

"job_defaults": {
    "frame_start": 1,
    "frame_end": 250,
    "chunk_size": 10,
    "priority": 50,
    "max_retries": 3,
    "timeout_seconds": null
}
Field Type Default Description
frame_start int 1 Default start frame.
frame_end int 250 Default end frame.
chunk_size int 1 Frames per chunk. Higher = fewer dispatches, lower = finer distribution across nodes.
priority int 50 Job priority (lower number = higher priority).
max_retries int 3 How many times a failed chunk is retried before giving up.
timeout_seconds int? null Kill the render process if a chunk takes longer than this. null = no timeout.

progress — stdout parsing

Tells MinRender how to extract progress information from the DCC’s stdout output.

"progress": {
    "patterns": [
        {
            "regex": "Rendering (\\d+)\\s*/\\s*(\\d+) samples",
            "type": "fraction",
            "numerator_group": 1,
            "denominator_group": 2,
            "info": "Cycles sample progress"
        }
    ],
    "completion_pattern": {
        "regex": "Saved: '?(.+)'?",
        "info": "Blender logs 'Saved:' when a frame is written"
    },
    "error_patterns": [
        { "regex": "CUDA error.*", "info": "GPU failure" }
    ]
}

patterns[] — progress tracking

Each pattern extracts a progress value from a stdout line.

Field Type Description
regex string Regex applied to each stdout line.
type string "fraction" (e.g. 5/100) or "percentage" (e.g. 50%).
numerator_group int Capture group for the numerator (fraction type).
denominator_group int Capture group for the denominator (fraction type).
group int Capture group for the percentage value (percentage type).
info string Description (for debugging/documentation).

completion_pattern — frame completion

Optional. When matched, signals that a frame has finished rendering. Used for per-frame progress tracking in multi-frame chunks.

error_patterns[] — error detection

When matched, the chunk is marked as failed immediately. Each entry has regex and info.


output_detection — rendered file detection

How MinRender finds the path of rendered output files. Used for validation (checking that the file exists and is non-zero after rendering).

"output_detection": {
    "stdout_regex": "Saved: '?(.+\\.[a-zA-Z0-9]+)'?",
    "path_group": 1,
    "validation": "exists_nonzero",
    "info": "Blender prints 'Saved: <path>' after writing each frame"
}
Field Type Default Description
stdout_regex string? null Regex to extract the output file path from stdout. null = no stdout detection.
path_group int 1 Capture group containing the file path.
validation string "exit_code_only" "exists_nonzero" = check that the file exists and is > 0 bytes. "exit_code_only" = trust the exit code.
info string "" Description.

process — process control

"process": {
    "working_dir": null
}
Field Type Default Description
working_dir string? null Working directory for the process. null = inherit. Supports runtime tokens ({chunk_start}, etc.).

On cancel or timeout, MinRender always kills the renderer’s entire process tree immediately (Job Object on Windows, process group on macOS) — this is not configurable. A kill_method field from older templates is ignored.


Complete flag examples

Blender

"flags": [
    { "flag": "-b", "value": null, "info": "Background mode" },
    { "flag": "", "value": "", "info": "Scene File", "editable": true, "required": true, "type": "file", "filter": "blend" },
    { "flag": "-o", "value": null, "info": "Output path flag" },
    { "flag": "", "value": "", "info": "Output Path", "editable": true, "required": true, "type": "output",
      "default_pattern": "{project_dir}\\..\\renders\\{file_name}\\{file_name}_{frame_pad}" },
    { "flag": "-F", "value": "OPEN_EXR_MULTILAYER", "info": "Output Format" },
    { "flag": "-s", "value": null },
    { "flag": "", "value": "{chunk_start}" },
    { "flag": "-e", "value": null },
    { "flag": "", "value": "{chunk_end}" },
    { "flag": "-a", "value": null, "info": "Render animation" }
]

Produces: blender -b scene.blend -o /renders/shot/shot_#### -F OPEN_EXR_MULTILAYER -s 1 -e 10 -a

Cinema 4D (with optional flags)

"flags": [
    { "flag": "-nogui", "value": null },
    { "flag": "-render", "value": null },
    { "flag": "", "value": "", "info": "Scene File", "editable": true, "required": true, "type": "file", "filter": "c4d" },
    { "flag": "-take", "value": null },
    { "flag": "", "value": "", "info": "Take Name", "editable": true },
    { "flag": "-oimage", "value": null },
    { "flag": "", "value": "", "info": "Output Path", "editable": true, "required": true, "type": "output" },
    { "flag": "-frame", "value": null },
    { "flag": "", "value": "{chunk_start}" },
    { "flag": "", "value": "{chunk_end}" },
    { "flag": "", "value": "1", "info": "Frame step" }
]

With take left blank: Commandline -nogui -render scene.c4d -oimage /renders/shot/shot -frame 1 10 1 (The -take flag and its empty value are both omitted automatically.)


This site uses Just the Docs, a documentation theme for Jekyll.