Developing

Write custom commands and build custom plugins for Kiosk Library.

Custom Commands

A custom command is a Python function that runs inside your DCC when an asset is exported. Commands live in .py files — one function per file is fine, multiple is also allowed. Every function whose name starts with kiosk_ is automatically picked up by Kiosk.

To create one: Plugin Manager → Edit Commands → New Script. Kiosk creates a stub file and opens it for editing.

file_info

Every command receives file_info — a dictionary Kiosk fills with information about the exported asset:

KeyDescription
file_pathFull path to the asset file
file_nameFilename with extension
source_nameName of the source the file belongs to
category_nameActive category (e.g. textures, hdri)
tagsList of subfolder names
render_engineRenderer configured in Plugin Manager

Right-click any asset → Development → Debug File Info to inspect the full dictionary.

# Copy asset to the project folder
def kiosk_copy_to_project(file_info):
    import shutil, os
    dst = os.path.join('C:/project/assets', file_info['file_name'])
    shutil.copy2(file_info['file_path'], dst)

Stack chaining

The command stack runs top to bottom. Each command can modify file_info and return it — the modified version is passed to the next command in the stack. This lets commands cooperate: one copies the file and updates the path, the next imports from that new path.

# Copy to project and update the path for the next command
def kiosk_stage_file(file_info):
    import shutil, os
    dst = os.path.join('C:/project/assets', file_info['file_name'])
    shutil.copy2(file_info['file_path'], dst)
    file_info['file_path'] = dst
    return file_info

A command that returns nothing (or None) passes file_info unchanged to the next step.

Arguments

Any parameter after file_info with a default value is promoted to the Plugin Manager UI. Artists can adjust the value per-stack without ever touching the script file.

Default typeUI control
boolCheckbox
intInteger field
floatDecimal field
strText field
# Import FBX with artist-adjustable options
def kiosk_import_fbx(file_info, center_on_import=True, scale=1.0):
    import bpy
    bpy.ops.import_scene.fbx(filepath=file_info['file_path'], global_scale=scale)
    if center_on_import and bpy.context.active_object:
        bpy.context.active_object.location = (0, 0, 0)

center_on_import shows as a checkbox, scale as a decimal field. The artist configures them in the Command Stack editor by clicking the next to the command — saved values travel with the stack.

The comment on the line directly above def kiosk_... becomes the tooltip in the UI:

# Import FBX and snap to world origin
def kiosk_import_fbx(file_info, center_on_import=True, scale=1.0):
    ...

Keep all DCC imports (import bpy, import maya.cmds, etc.) inside the function body — Kiosk reads the signature without executing the file.


Custom Plugins

A custom plugin adds a new DCC tab to Kiosk’s Plugin Manager — useful for integrating a DCC that Kiosk doesn’t ship with (Nuke, Resolve, an in-house tool).

A plugin is just a folder with a manifest.json and a commands/ subfolder. No compilation, no installer.

Folder structure

Nuke/
├── manifest.json
├── icon.png
└── commands/
    └── kiosk_send_to_read.py

manifest.json

{
    "id": "Nuke",
    "name": "Nuke",
    "version": "1.0.0",
    "icon": "icon.png",
    "commands_dir": "commands",
    "render_engines": ["Nuke"],
    "default_command_stacks": {
        "assets": [
            {"command": "kiosk_send_to_read", "active": true, "args": {}}
        ]
    }
}
FieldRequiredDescription
idyesUnique identifier. No spaces. Must match what the DCC passes as --host.
nameyesDisplay name in the Plugin Manager tab.
versionyesVersion string.
iconyesPath to a 128×128 PNG (relative to plugin root).
commands_diryesPath to your kiosk_*.py files (relative to plugin root).
render_enginesnoList of renderer names for the dropdown. Omit to hide it.
categoriesnoLimit to specific categories (hdri, assets, textures). Omit for all.
default_command_stacksnoWhat new users see before they edit anything.
kiosk_min_versionnoMinimum Kiosk version required.

Activating

In Plugin Manager → Custom Plugins Folder, point Kiosk at the folder that contains your plugin folder (the parent of Nuke/). Restart Kiosk — the tab appears.

If it doesn’t appear, check %APPDATA%\Kiosk\kiosk-<pc>.log for kiosk.plugins entries, or look for the ⚠ N plugins failed to load button in the Plugin Manager footer.

Making exports reach the DCC

The plugin folder covers the Kiosk side. For assets to actually land inside the DCC, you also need a small Python script running inside the DCC that launches Kiosk with a session ID, then watches a shared folder for export.json and dispatches the command stack when it arrives.

Use the bundled Blender plugin (Plugins/Blender/plugin/kiosk_blender_plugin.py) as a starting point — it implements the full round-trip. The helpers in Plugins/Common/kiosk_plugin_core.py (build_kiosk_launch_cmd, import_modules_from_folder, process_data) handle the platform-specific parts and are shared by all bundled DCC plugins.

Distribution

Point everyone’s Custom Plugins Folder at a network share containing the plugin folder. Updating the share updates everyone on their next restart. Kiosk never writes to the custom plugins folder.

To override a bundled plugin, set your custom plugin’s id to match (e.g. "id": "Maya"). Kiosk loads yours instead.

behind KioskMeet the maker →