Isberg Labs 0.21.0 · Documentation

Help · 0.21.0 · updated 2026-11-04

Isberg Labs documentation

Everything about Isberg Labs in one place: installing and the free trial, the workspace and projects, every one of the twenty editors, scripting languages, exporting games to five platforms, the 375 MCP tools, file formats, compatibility limits, troubleshooting and the license.

Isberg Labs 0.21.0
Windows x64 portable · one lifetime license, one device at a time
Chapters
30
Topics
402
MCP tools
375, each with parameters
Applies to
Isberg Labs 0.21.0

Search filters the contents by every word on the page. Press Enter to jump to the first match. Headings show a # link when you hover them.

Introduction

Isberg Labs is a portable game-development workstation for Windows x64. Twenty editors share one local project, so you can draw sprites, build worlds, model and animate 3D scenes, compose music and sound, write game logic and export a playable game without installing anything else. This page documents version 0.21.0.

What Isberg Labs is

Isberg Labs runs from a single folder that you unzip anywhere. The folder carries everything the editors need: the desktop runtime, the bundled game engine, compilers for C, C++ and C#, a Lua 5.4 runtime, a V8 JavaScript runtime, image and audio codecs, mesh and map decoders, and export templates for five platforms. Nothing is downloaded while you work.

All editors open inside one workspace. Each editor is a window you can move, overlap, dock, maximize or pull onto another monitor. Editors share the project's assets, the Inspector, the Output and History docks, and one Undo/Redo history. The whole workspace, with every document and asset, saves as one .isberg project file.

A local MCP server ships in the same folder. It exposes 375 tools that read and write images, scenes, meshes, audio, rigs, levels and RPG projects, and that can drive the real editors through their own controls. See MCP server guide.

At a glance

Version0.21.0 (Windows x64 portable)
Editors20 editors plus 3 shared panels (Scene/Inspector, Assets, and the bottom dock)
Game presets10 game types in 19 editors
LanguagesGDScript, C#, C and C++ (GDExtension), JavaScript (V8), Lua 5.4
Export targetsWindows, macOS, Linux, Android (APK, AAB, APKS), iOS/iPadOS (Xcode project), Web
MCP375 local tools over stdio, server id gamebench
Project file.isberg (earlier .gbench projects still open)
LicenseOne lifetime license, activated on one device at a time, validated online. 14-day free trial.
Network useLicense activation and validation only. Projects, editors, exports and MCP work stay on your computer.
AINo generative AI, models or inference runtimes are included.

The twenty editors

Open any editor from the Tools palette on the left side of the workspace. Each row links to its chapter.

EditorWhat it is forChapter
Pixel & animationDraw sprites, animate layers, repair artwork and build tilesets.Pixel & animation
Textures & terrainConvert, paint, clone, tile, animate and sculpt materials.Textures & terrain
World builderGenerate towns, buildings, landscapes and floor plans.World builder
3D scene & animationModel, rig, animate, light and export complete scenes.3D scene & animation
Music & compositionCompose, sequence, sample and automate multitrack audio.Audio
Level & playtestBuild game-specific levels and test movement and interactions.Level & playtest
RPG CreatorBuild RPG maps, database records, characters and events; playtest and export your adventure.RPG Creator
Tile modelerBuild textured tile geometry and paint vertices.Tile modeler and Vertex painter
Vertex painterPaint mesh colors, edit normals and refine vertex masks.Tile modeler and Vertex painter
Sprite lightingCreate normal, height, specular and occlusion maps.Sprite lighting
Audio workshopLayer procedural sounds, mix local recordings and shape ambience.Audio
Parameter soundDesign layered sounds with editable controls and native sound-project formats.Audio
Sound designerSynthesize game sounds with an editable signal chain.Audio
Avatar stageRig layered sprites with speaking, blink and motion.Avatar stage
JavaScriptAuthor full JavaScript modules and run game logic locally.JavaScript editor
Game runtimeRun full local game projects and export playable builds.Game runtime
Formats & interchangeImport local scene formats and transfer geometry into the scene editor.Formats & interchange
Script workspaceWrite and run scene scripts locally with inspectable state.Script workspace & languages
Shader graphBuild editable material graphs and preview their compiled shaders.Shaders
Shader materialsEdit shader source and compile materials on your local GPU.Shaders

The engine underneath

The Game runtime editor, native playtests and native exports run on a heavily modified build of the open-source Godot Engine that is bundled inside the portable folder: a custom 4.7.2 Windows editor and runtime, and official Godot 4.5.2 export templates. It opens and runs native Godot-format projects with GDScript and GDExtension. No separate engine installation is launched or downloaded.

Note. Isberg Labs is an independent project. It is not affiliated with or endorsed by the Godot Foundation or by the makers of any other tool whose file formats it reads or writes. See Third-party software & notices.

How to read this documentation

  • New here? Read Install & first start, then The workspace and Projects, assets & history.
  • Each editor has its own chapter, ending with the MCP tools for that editor and, where useful, troubleshooting.
  • To ship a game, read Exporting games. RPG Creator and JavaScript projects also have their own delivery sections.
  • Buying, trial, activation, devices and offline use are in License.
  • Use the search box above the contents list to filter topics. Every heading has a link you can copy.
  • Labels in bold are the exact names of buttons, tabs, menus and fields in the app. Monospace marks file names, paths, commands and values you type.

Install & first start

Isberg Labs has no installer. You download a ZIP, extract it, and run Isberg Labs.exe. On first start the license window asks you to start the free trial or activate a key.

System requirements

ItemRequirement
Operating systemWindows 10 or 11, x64. The studio itself runs only on Windows; it exports games for other platforms.
Disk spaceAbout 2.6 GB for the ZIP and 4.8 GB (about 25,900 files) once extracted, plus room for your projects and exports. Keep the ZIP until the extracted copy works, or delete it to reclaim space.
GraphicsA GPU with current drivers is recommended for 3D views, shader previews and native playtests. A software Vulkan driver (SwiftShader) is bundled as a fallback, which is slower.
InternetNeeded to start the trial, activate a license and revalidate it about once a day. You can work offline for up to 14 days after the last successful check. See Working offline.
Other softwareNone. Node.js, npm, an engine editor, a JDK, an Android SDK, compilers and codecs are all bundled. Building iOS apps additionally needs a Mac with Xcode and an Apple signing identity; see Exporting games.

Download and verify

  1. Download Isberg Labs 0.21 Portable.zip from the Download section of isberglabs.com. The same section shows its SHA-256 checksum.
  2. Check that the download is complete and unmodified. In PowerShell, in the download folder:
    Get-FileHash '.\Isberg Labs 0.21 Portable.zip' -Algorithm SHA256
    The hash must match the checksum shown on the Download section (or the first value in the .sha256 file, if you have it).
  3. Extract the whole ZIP to a short path you can write to, for example C:\Isberg Labs or D:\Isberg Labs. Deep folders such as Downloads\… can hit the Windows path-length limit. Avoid C:\Program Files: the folder must be writable because it holds your preferences, recovery copies and license.
Caution. Keep the extracted folder together. Isberg Labs.exe needs the files next to it (resources, the .pak/.dll runtime files, locales). Do not copy the executable on its own; make a shortcut to it instead.

What is in the portable folder

ItemPurpose
Isberg Labs.exeThe studio. Double-click to start.
Start Isberg Labs.cmdStarts the studio from a command prompt or script.
MCP.cmdStarts the local MCP server on stdio, and runs license commands (MCP.cmd --license …). See MCP and License commands.
mcp-config.jsonA ready-made MCP client configuration with this folder's absolute paths.
README.txtShort start-up notes.
Data\Created on first start. Portable preferences, local storage, window layout, recovery copies, your saved Lua/JS scripts, palettes and styles, project blobs and the license file (license.json). Copy it to keep your settings when you upgrade.
Projects\A suggested folder for your projects and exports. It is also the default MCP workspace folder.
resources\app\The studio application, engines, MCP server, CLI tools, examples and the bundled docs\ (including THIRD_PARTY_NOTICES.md and MCP-CAPABILITIES.json).
LICENSE, LICENSES.chromium.htmlNotices for the bundled desktop runtime. See Third-party software.

First start

  1. Open Isberg Labs.exe. If Windows SmartScreen warns about an unrecognized app, choose More info, check the file came from isberglabs.com, then Run anyway.
  2. The Isberg Labs license window opens on its own. Nothing else starts until this device has a trial or a license.
  3. Choose one:
    • Start 14-day free trial to use every feature for 14 days without a key. See Free trial.
    • Paste your key into License key and choose Activate. See Activating a license.
    • Buy a license opens the store page in your browser.
  4. When the status shows Active on this device or Free trial — 14 days left, choose Open Isberg Labs. The workspace opens on the Overview.
  5. Open an editor from the Tools palette, or choose Game presets to start from a game type. See The workspace and Game presets.

On later starts the studio opens directly, using the saved license check. If an automatic recovery copy of your last session exists, the header shows Restore recovery, which reopens your last session's workspace. See Automatic recovery.

Tip. Isberg Labs runs as a single instance. Opening a file with Isberg Labs.exe (for example by dragging a file onto the executable or a shortcut, or from the command line) while the studio is running sends it to the open window instead of starting a second copy.

Upgrading to a new version

  1. Save your work and close Isberg Labs.
  2. Extract the new ZIP into a new folder. Do not extract over the old version.
  3. Copy the old folder's Data folder into the new folder. This keeps your preferences, window layout, recovery copy, saved scripts and palettes, and this device's license activation.
  4. If you kept projects or exports in the old Projects folder, copy or move them as well.
  5. Start the new Isberg Labs.exe and open a project to confirm it works. Keep the old folder until it does.
  6. If an MCP client points at the old folder, update the paths in its configuration (see MCP).

Files saved by earlier versions open unchanged, including the earlier names .gbench and .gb*. A recovery copy left by an earlier version is still offered.

Note. Upgrading from 0.20 or earlier: those builds had no license window. Version 0.21.0 asks for a trial or a key on first start.

Moving to another folder, drive or PC

  • Another folder or drive on the same PC: close the studio and move the whole folder. The license stays active because it is bound to the PC, not the folder. Update MCP client paths afterwards.
  • Another PC: first open License in the sidebar and choose Deactivate this device, then copy the folder (or extract a fresh ZIP) on the new PC and activate there. A license.json copied from another PC is rejected. See Devices and moving your license.

Uninstalling

  1. If you will use the license on another PC, open License and choose Deactivate this device first. (You can also free the slot later from the other PC's license window.)
  2. Move any projects you want to keep out of the folder.
  3. Close the studio and delete the folder.

There is no installer to undo. Preferences, caches, recovery copies and the license live in the Data folder inside the portable folder, so deleting the folder removes them. Files you saved or exported elsewhere stay where you put them.

The workspace

Isberg Labs runs all twenty editors inside one Studio window: a header with project commands, a Tools palette, shared Inspector and Assets panels, a bottom dock and a desktop of movable editor windows. This chapter covers that shared shell. Each editor's own controls are described in its chapter.

Classic interface

Studio uses a classic workstation look: a blue desktop, medium-gray beveled windows, striped title bars, recessed fields, compact tabs and small colored tool icons. Fonts come from the local Windows fonts (Tahoma, with Arial as a fallback); nothing is downloaded.

  • The same classic styling is applied to every built-in editor page, including the four nested map editors of the World builder and the dialogs.
  • Canvases, game previews, palettes, swatches and other authored colors are never restyled. Game previews and authored scenes keep their own artwork and rendering.
  • The integrated native project editor in Game runtime uses a matching local theme with gray surfaces and beveled borders. That theme stays in the portable editor configuration and is never added to your game projects or exports. See Game runtime.
  • At smaller window sizes the editor layouts reflow and long menus scroll. The main window opens at 1700 × 1050 by default and cannot be made smaller than 800 × 600.
Note. The classic theme is the only shell theme in 0.21. There is no theme switch, dark-mode option or Preferences dialog for the shell's appearance.

App header

The header across the top of the window holds the project commands.

ControlWhat it does
Project name fieldThe project's name, Untitled project by default. Save project uses it as the suggested file name. Renaming is recorded in the shared history, so Undo reverts it.
Save statusReads On this computer until the first save in the session, then Saved locally.
↶ (Undo) and ↷ (Redo)Undo or redo the last shared action across all editors, the asset shelf, the project name and the window layout. The Undo tooltip names the action it will undo. See Shared Undo/Redo.
Restore recoveryAppears only when an automatic recovery copy exists. Opens it. See Automatic recovery.
Open projectOpens a saved project. See Open and save.
Save project Ctrl+SSaves the whole workspace as one .isberg file. It always asks where to save.

Below the header, the workspace bar shows the active editor's group, name and one-line description, followed by the layout and window controls (Layouts, Window controls) and the workspace actions Game presets, Tool options, ▶ Play, Share document, Update asset and Capture ↗ (Workspace actions).

The bottom of the Tools panel holds four more buttons:

Entirely local
A status indicator for the project work done on this computer. License activation and validation still go online; see License.
⌘ MCP connection
Shows how to connect an MCP client: start MCP.cmd from the portable folder, or point your client's configuration at it under the server id gamebench. See MCP server guide.
◉ Feature coverage
Opens the bundled compatibility notes in a dialog. See Compatibility limits.
⚿ License
Opens the license window. During a trial the button reads Trial: N days left; when online validation is needed it shows ⚠ License: validate online. Nothing closes while you work.

Tools palette and Scene tree

The left panel (title Tools; Tools & scene when it floats) has two tabs, Tools and Scene.

Tools palette

The Tools tab lists the Overview and the twenty editors, each with an icon, a short label and a two-digit number. Hover a button to see the full editor name. Click it to open the editor and bring it to the front: in Floating windows it opens in its own window, in docked layouts it opens as a tab in the focused dock.

No.Palette labelEditorChapter
00OverviewOverview page with a card for each editorthis chapter
01PixelsPixel & animationPixel & animation
02TexturesTextures & terrainTextures & terrain
03WorldWorld builderWorld builder
043D Scene3D scene & animation3D scene & animation
05MusicMusic & compositionAudio
06LevelsLevel & playtestLevel & playtest
07RPGRPG CreatorRPG Creator
08Tile 3DTile modelerTile modeler and Vertex painter
09VerticesVertex painterTile modeler and Vertex painter
10LightingSprite lightingSprite lighting
11AudioAudio workshopAudio
12SynthParameter soundAudio
13SFXSound designerAudio
14AvatarAvatar stageAvatar stage
15JavaScriptJavaScriptJavaScript editor
16RuntimeGame runtimeGame runtime
17FormatsFormats & interchangeFormats & interchange
18ScriptsScript workspaceScript workspace
19NodesShader graphShaders
20ShadersShader materialsShaders

The Overview page shows the same editors as numbered cards (01 to 20). Click a card to open that editor. An editor loads the first time you open it and then stays loaded, with its document, until you quit.

Scene tree

The Scene tab shows the active editor's document tree, captioned editor / scene.

  • It lists the document's objects, nodes, tiles, layers, tracks or sub-editors, up to 250 of each kind. Child items are indented.
  • Click an item to select it in the editor (where the editor supports selection) and show its properties in the Inspector.
  • For a running Game runtime project, the tree lists the native scene nodes.
  • If the active editor has no such list, the tree reads The active editor uses its own document tree. Vertex painter shows its vertex count instead. If the editor has not been opened yet, use Open active editor.

Choosing the Universal workspace layout switches this panel to the Scene tab automatically.

Inspector and Assets

The right panel (title Project; Inspector & assets when it floats) has two tabs, Inspector and Assets.

Inspector

  • Focused setting. Click into any field, list or text box in an editor and the Inspector shows it with a Value control. Changing the value there changes the editor's own control ("Live setting from editor").
  • All editor settings. Lists every enabled field, list, text box and button of the active editor, including controls inside its nested frames, with a count such as "N live settings/actions from the active editor." Buttons in the list run the editor's action.
  • Selected object. After you pick an item in the Scene tree, the Inspector lists its text, number and on/off properties, and vectors of two to four numbers as comma-separated values. IDs and embedded image data are not shown. Open All object properties to edit the complete object as JSON, then press Apply object properties. Each change is one undoable step.
  • Native nodes. For a Game runtime node, the Inspector shows Native object properties as JSON. Enter a Native property name and a JSON value, then press Apply native property.

Assets

The Assets tab is the project's shared asset shelf, headed Project assets with the asset count.

  • + (Import image) adds an image file (PNG, APNG, JPEG, WebP, GIF, BMP, TIFF or AVIF) as an image asset.
  • Find an asset… filters the shelf by name.
  • Image assets show a thumbnail; editable documents show ▣. The tooltip gives the image size, or the source editor and revision of a document.
  • Click an asset to select it. Double-click it, or press Use selected image, to use it in the active editor:
Selected assetActive editorResult
Editable documentAny editor with a compatible documentThe document is converted and replaces that editor's content, and the editor is linked to the asset. Undo restores the previous content. See Shared assets.
Editable documentOverviewOpens the document in the editor that published it.
ImagePixel & animation or OverviewOpens the image as a new sprite in Pixel & animation.
ImageSprite lightingLoads the image as the lighting source.
ImageOther editorsShows "Selected image is ready. Use Import image in this workspace."
Tip. While an image asset is selected on the shelf, editor buttons that import an image through Studio (for example Import image in Sprite lighting and Tile modeler, and Swatches from image in Vertex painter) take that asset instead of opening a file dialog.

The shelf, its documents and their links are saved in the project. Sharing, updating, using and removing documents are recorded in the shared history.

Bottom dock

The bottom dock (Files, animation & output when it floats) has five tabs. Click a tab to open its content. The ⌃ button (Expand bottom panel) shows or hides the content in docked layouts and minimizes the window in Floating windows.

TabWhat it shows
FileSystemA local file browser. Press Open folder… to choose a folder, ↑ to go up a level, and click a folder (▸) to enter it. Clicking an image or sprite file (PNG, JPEG, WebP, GIF, BMP, TIFF, AVIF, .isbsprite, .gbsprite, .pforge, .aseprite, .ase) opens it in Pixel & animation. Any other file up to 8 MB opens as text, with a Save file button that writes your changes straight to that file. Larger files show "Use the corresponding editor to import this binary resource." The folder you browse is remembered in the project; the files themselves are not embedded.
AnimationPlayback for the 3D scene & animation editor: ▶ Play, Ⅱ Pause and a time slider from 0 to 30 seconds. Until that editor is open it reads "Open the 3D scene editor to create animation clips." Avatar stage and the sprite editors keep their own timelines.
OutputA time-stamped log of the most recent 250 shell messages: Inspector edits, files opened or saved from FileSystem, recovery problems and page errors. Clear empties it.
HistoryThe shared history: Undo and Redo buttons, a counter such as "12 undo / 3 redo · 840 KB", and the list of entries, newest first, each with its label and the editors it touched. See Shared Undo/Redo.
MCPA short note on connecting MCP clients through MCP.cmd or mcp-config.json. See MCP server guide.

Layouts

Choose a layout from the Editor layout list in the workspace bar. The layout, including window positions, is saved in your local preferences and in every project file. Each layout change is also an undoable "Arrange window" step in the shared history.

LayoutArrangement
Floating windowsEvery open editor gets its own movable window on the blue desktop, and the Tools, Inspector & assets and Files, animation & output panels become small floating windows too. Editors that were not visible start minimized. This is the layout used on first start, with Pixel & animation and 3D scene & animation open.
Single editorOne dock containing only the active editor.
Universal workspaceOne large dock with all twenty editors as tabs. 3D scene & animation is selected and the left panel switches to the Scene tree.
Quad viewFour docks: 3D scene & animation and Tile modeler (top left); Pixel & animation, Textures & terrain, Sprite lighting and Vertex painter (bottom left); World builder (top right); Music & composition, Audio workshop, Sound designer and Avatar stage (bottom right).
Split rightSplits the focused dock into two side by side. The new dock is empty and focused: open an editor from the Tools palette or drag a tab into it. From Floating windows, all editors are first gathered into one dock.
Split belowThe same, with the new dock below.

Working with docks

  • Click a tab to show that editor. Drag a tab onto another dock's title bar or tab strip to move it there, or onto an empty part of the desktop to float it.
  • Double-click a tab, or a dock's title bar, to maximize the dock. Do it again to restore.
  • The × on a tab closes that editor tab. The editor and its document stay loaded and are still saved with the project; open it again from the Tools palette.
  • The + at the end of a tab strip opens the Tools palette.
  • Drag the divider between two docks to resize them, between 10% and 90% of the space.
  • You can have at most eight docks at once.
  • In docked layouts the Tools, Inspector/Assets and bottom panels stay fixed at the left, right and bottom of the window. They become windows only in Floating windows. They cannot be dropped into an editor dock ("Utility panels keep their own windows.").

Choosing Floating windows, Single editor, Universal workspace or Quad view first brings any editors you moved to other monitors back into Studio.

Window controls

In Floating windows, every editor and utility panel is a window you can move, overlap, resize, minimize and maximize inside Studio.

ToDo this
Move a windowDrag its title bar.
Resize a windowDrag any edge or corner.
Bring a window forwardClick anywhere in it.
MinimizeTitle-bar −. Minimized windows appear as buttons in the strip along the bottom of the desktop; click one to restore it. With nothing minimized the strip shows a short hint.
Maximize or restoreTitle-bar □ (it changes to ▣ while maximized), or double-click the title bar. A maximized window fills the desktop.
CloseTitle-bar × closes the window and all of its tabs. The editors stay loaded with their documents.
Float a docked editorIn docked layouts, the title-bar ↗ with the tooltip "Float editor", or drag its tab onto the desktop.
Move an editor to another monitorThe title-bar ↗ with the tooltip "Move editor to another screen", or drag the title bar past the edge of the Studio window. See Other monitors.
Find or reopen a windowThe Windows… list. It lists every open window: minimized ones are marked ▱ and editors on other monitors ↗. It also offers the Tools & scene, Inspector & assets and Files, animation & output panels when they are closed. Choosing an entry restores, focuses or reopens it.
Tidy upCascade arranges the visible editor windows in an overlapping cascade. Minimized windows and the utility panels are not moved.
Bring back desktop windowsGather (shown only while an editor is on another monitor) returns all of them to Studio.
Cancel a drag or resizePress Esc before releasing the mouse. The window returns to where it was.

Moving windows with the keyboard

Tab to a floating window's title bar, then:

  • Arrow keys move the window 10 pixels; hold Alt for 1-pixel steps.
  • Shift+arrow keys resize it (Left/Right change the width, Up/Down the height), also in 10-pixel steps or 1-pixel steps with Alt.

Sizes and limits

  • Editor windows are at least 240 × 160 pixels, utility panels at least 110 × 100, and no window can be larger than the desktop area.
  • When the Studio window gets smaller, windows are pulled back inside the reachable area.
  • Up to 48 floating windows are supported.
  • Positions, sizes, tab groups, overlap order and minimized and maximized states are saved in local preferences and in .isberg projects. Layouts from older versions still load.
  • Native Windows viewports (such as the Game runtime engine view) show only the parts not covered by other windows. They hide briefly while you drag or resize a window, or while a dialog is open.

Workspace actions

Game presets
Opens the Game presets dialog for the active editor. See Game presets.
Tool options
Shows or hides the active editor's detailed control panel; the button is highlighted while it is on. In 3D scene & animation it toggles the side panel of detailed controls, which is hidden by default. In Pixel & animation it shows the side panels as an overlay when the editor window is narrower than 900 pixels (they are hidden automatically at that width). Other editors keep their controls visible and are not affected.
▶ Play
In RPG Creator, starts the RPG playtest. In 3D scene & animation and Level & playtest, sends the current scene or level to Game runtime and runs it as a native game. In every other editor, switches to Game runtime and runs its current project. See Game runtime.
Share document
Adds the active editor's complete editable document to the asset shelf and links the editor to it. See Shared assets.
Update asset
Saves the active editor's current document as a new revision of its linked asset (or of the selected document asset) and updates the other linked editors.
Capture ↗
Adds a picture of the active editor to the asset shelf. In Pixel & animation it adds the current frame with all visible layers composited, named "Sprite N". In other editors it captures the largest canvas, named "Capture N"; if the editor has no canvas, it says "Use this workspace’s export or publish control." Hidden on the Overview.

Editors on other monitors

Any of the twenty editors can leave the Studio window and become a separate Windows desktop window, for example on a second monitor. The Overview and the Tools, Inspector/Assets and bottom panels always stay in Studio ("This panel stays in the main workspace.").

  1. Drag the editor's title bar past the outer edge of the Studio window and release it, or click the title-bar ↗ ("Move editor to another screen").
  2. The editor opens in its own window, titled "Editor — Isberg Labs", with its current document. Its window inside Studio is locked until it returns.
  3. Move the new window with its standard Windows title bar to any monitor. It resizes, minimizes and maximizes independently. Monitors placed left of or above the main screen work too.
  4. To bring it back, press ↙ Return to workspace in the window, close it with its Windows ×, choose Gather in Studio, or close its tab in Studio.
  • The Windows… list marks detached editors with ↗; choosing one brings its desktop window to the front.
  • A detached editor is still part of the same project: Save project includes its latest document, and the shared Undo/Redo, the asset shelf and Ctrl+S work from either window.
  • Opening another project, or choosing the Floating windows, Single editor, Universal workspace or Quad view layout, first returns all detached editors to Studio.
  • Moving an editor in either direction reloads its view from the current editable document. Temporary view state (such as camera position or selection) and the editor's own local undo stack may reset; the shared history is kept.
  • If a monitor is disconnected or rearranged, its windows move to a screen that is still available, keeping their size where possible.

Running games and playback during a move

A live engine session cannot run in two windows at once. When you move an editor, any playback or playtest in it is paused or stopped first. For Game runtime, the active native or web game session stops while the authored project is kept; Studio shows "Runtime project moved. Choose Edit project or Run to resume." Press Edit project or Run in the new window to continue. The same applies when the editor returns. The JavaScript, Music & composition, Sound designer and Parameter sound documents are copied across exactly as they were.

Remembered placement

  • Studio remembers each desktop window's monitor, normal position and size, and minimized or maximized state, and the main window's own placement.
  • If you quit with editors detached, they reopen in the same places at the next start. The automatic recovery project is opened first so they come back with their documents.
  • An editor you returned to Studio stays in Studio at the next start; its last desktop placement is reused the next time you pop it out.
  • Placements are stored in desktop-windows.json in the portable Data folder (or your profile folder), not in the project file. Up to 48 editor placements are kept.
Caution. If a detached window is destroyed without returning its document (for example after a crash), Studio reports "The editor window closed unexpectedly. Save your project before reopening it." Save the project before you open that editor again.

Editor settings and preferences

  • Editor settings live in each editor. Use Tool options to reveal hidden detail panels, and the Inspector's All editor settings to reach every control of the active editor from one list.
  • Local preferences (the current layout and the settings editors keep between sessions) are stored in the portable Data folder, or in your profile folder when you use GAMEBENCH_PROFILE.
  • Desktop window placements are stored separately in desktop-windows.json.
  • Pixel & animation keeps its palette library, scripts, style cards and Lua extensions in folders inside Data. See Pixel & animation.
  • Each project save includes a copy of the local preferences. Opening a project restores that copy, replacing your current local preferences.

Copy the Data folder along with the application folder to keep your preferences on another drive or computer. See Data and Projects folders.

Keyboard shortcuts

These shortcuts are defined by the Studio shell and work in every editor. Ctrl+Z and Ctrl+Y are ignored while you type in a text field or text box, and when Alt is also held.

KeysActionNotes
Ctrl+SSave projectWorks everywhere, including inside the embedded editors and detached windows. Ctrl+Shift+S also runs Save project. To save a single sprite file, use the File menu in Pixel & animation.
Ctrl+ZUndo (shared history)Inside Pixel & animation, Textures & terrain, World builder and Audio workshop the shared history is used when it has something to undo; otherwise the key goes to the editor itself.
Ctrl+Y or Ctrl+Shift+ZRedo (shared history)Same rules as Undo.
EscCancel a window drag or resizeThe window returns to its previous position and size.
Arrow keys (title bar focused)Move the floating window 10 pxAdd Alt for 1 px.
Shift+arrow keys (title bar focused)Resize the floating window 10 pxAdd Alt for 1 px.
Double-click a title bar or tabMaximize or restore
F12Open or close the developer toolsIn the main window and in detached editor windows. F5 and Ctrl+R (reload) are blocked in detached windows.

Shortcuts inside editors

These keys are handled by the editors themselves and work while that editor's canvas or panel has focus (not while you type in a field). In these editors Ctrl+Z and Ctrl+Y always use the shared history, which also records their edits. Pixel & animation has its own menu shortcuts, including Ctrl+O (Open…) and Ctrl+Space (Command palette); see Pixel & animation. The editors in separate pages (Textures & terrain, World builder, Audio workshop) are covered in their chapters.

EditorKeysAction
3D scene & animationShift+clickAdd a component (vertex, edge or face) to the selection
Ctrl+clickRemove a component from the selection
Level & playtest (editing)DeleteDelete the selected object
Level & playtest (local playtest)W A S D or arrow keysMove
ShiftSprint
SpaceJump
CToggle crouch
NToggle noclip
Space / left CtrlMove up / down while noclip is on
FToggle the torch (when the level enables it)
RPG Creator (playtest canvas)Arrow keys or W A S DMove the player
Enter or SpaceInteract, or advance the current message
Tile modeler (canvas)TabSwitch between the Draw and Select tools
W A S DMove the cursor one grid step (and the selection, unless the Draw tool is active or Shift is held)
Hold SpaceMake W/S move in depth instead of up and down
Q / ERotate the selection 90° one way or the other around the drawing plane's axis
Ctrl+ASelect all
Ctrl+C / Ctrl+VCopy / paste
DeleteDelete the selection
Vertex painterEscCancel the stroke being painted
F1 / F2Paint the color channel / the normal channel
XSwap the brush and background colors
Shift+EEyedropper tool
[ / ]Make the brush larger / smaller
Ctrl+V, Ctrl+E, Ctrl+FBrush targets vertices, edges or faces
Ctrl+mouse wheelChange the brush radius
Mouse wheelZoom the view
Avatar stageEscCancel the current drag
1–9, 0Switch to costume 1–9; 0 is costume 10
Arrow keysNudge the selected layer 1 px (Shift: 10 px)
SpaceToggle speaking
Keys you assignExpression keys, layer hotkeys (toggle visibility) and rig hotkeys (costume, expression, toggle, speak, blink)
The output window also accepts the number keys, assigned keys, Space (speaking) and B (toggle blink).
Script workspaceCtrl+EnterAttach the script to the selected scene node
TabInsert four spaces in the code editor
JavaScript, Shader materialsTabInsert two spaces in the source editor. In JavaScript, the running game canvas receives all keys while it has focus.

MCP tools

The workspace tools drive the running desktop app. If it is not running, they start the bundled app without showing it.

Troubleshooting

A window is lost off-screen or behind others
Choose it in the Windows… list, or press Cascade. For a desktop window, use Gather.
"This panel stays in the main workspace."
The Overview and the shared panels cannot move to another monitor. Move an editor instead.
"The detached editor did not finish loading."
The desktop window did not get ready within 45 seconds. The editor stays in Studio; try again.
"Utility panels keep their own windows."
The Tools, Inspector/Assets and bottom panels cannot be docked into an editor group.
"At most eight simultaneous editor docks are supported." / "At most 48 floating panels are supported."
Close or merge docks or windows first.
"Recovery could not be written. Close without saving this workspace?"
Studio could not write its recovery copy while closing. Choose Cancel and save the project yourself, or confirm to close anyway.
Keys do nothing in an editor
Editor shortcuts need the editor's canvas or panel to have focus. Click the canvas first. Shortcuts are ignored while you type in a field.

Projects, assets & history

A project saves the whole workspace in one portable .isberg file: every opened editor's document, the shared asset shelf, the window layout and the shared Undo/Redo history. This chapter covers saving and opening, automatic recovery, the portable folders, shared assets, history, bundles and the file extensions Isberg Labs uses.

Open and save

Save project

  1. Type a name in the project name field in the header (optional).
  2. Press Save project or Ctrl+S.
  3. Choose a location. The suggested file name is the project name with .isberg added; characters other than letters, digits, spaces, hyphens and underscores are dropped.

Save project asks for a location every time, so it also serves as "Save as". After a save the header reads Saved locally. Each save first collects the latest state from every editor, including editors on other monitors, and finishes any pending history entries.

  • The file is written to a temporary file, verified, and only then moved over the destination. If saving fails or is cancelled, the previous file is kept.
  • Several saves to the same file run one after another in the order you started them.

Open project

Press Open project and choose the file. It opens .isberg projects, projects saved by earlier versions (.gbench, .veldryne) and older plain-JSON project files.

  • Editors on other monitors are returned to Studio first.
  • The project is checked completely before anything changes. The window is locked while the project is restored.
  • Editors that are not in the project are reset to their initial state.
  • If any editor fails to restore, your previous workspace is put back and the error is shown.

Starting a new project

There is no separate New project command. Each start of Isberg Labs begins an untitled workspace with an empty asset shelf, unless editors were left on other monitors (then the previous session's recovery copy opens; see Automatic recovery). Within an editor, use that editor's own New command (for example New in RPG Creator and Tile modeler, New from template in Level & playtest, New composition in Music & composition).

What an .isberg file contains

PartContents
ProjectProject ID and name.
EditorsThe complete document and settings of every editor you opened in the session, including editors on other monitors, the Pixel & animation sprite tabs, the applied game-preset recipe of each editor, Game runtime project files and JavaScript session journals.
Asset shelfImage assets (embedded as PNG) and editable document assets with their revisions, editor links, conversion options and dependencies.
LayoutThe dock tree, floating windows with their positions, sizes, tabs, overlap order and minimized and maximized states, and the bottom-dock state (open tab, browsed folder, selection).
HistoryThe shared Undo/Redo history, including the redo branch.
PreferencesA copy of the local preferences; opening the project restores it.

Not included: desktop window placements on other monitors, the license record, Studio's caches, and files you merely browsed in the FileSystem tab.

The container

  • An .isberg file is a binary container: a header, a JSON manifest protected by a SHA-256 checksum, and content-addressed data blocks. Large text, large number arrays and binary data are stored once as blocks identified by their SHA-256 hash and size, so repeated history copies of the same data do not grow the file.
  • The file is self-contained. It needs neither the original source folders nor Studio's block cache (Data\ProjectBlobs), and it never stores absolute cache paths.
  • Opening verifies the manifest and every block, even when a matching block already exists in the cache.
  • The editor documents inside keep their own version; the container is format version 2. Older plain-JSON projects remain readable.
Limits. The practical limits are free disk space and memory. The manifest may be at most 256 MiB, documents may be nested at most 512 levels deep, and a Game runtime project may hold up to 100,000 files. Documents loaded into an editor still need the memory to hold them.

Automatic recovery

Studio writes a recovery copy of the whole workspace every 45 seconds and again when you close the app. The copy uses the same format as a saved project and is stored as recovery\workspace.isberg in the Data folder (or your profile folder). Copies left by earlier versions (workspace.veldryne, workspace.gbench) are still found.

  • With editors on other monitors at quit: at the next start the recovery copy opens automatically, before those editor windows reappear.
  • Otherwise: the header shows Restore recovery. Press it to open the copy from the previous session.

When Studio starts, it first keeps the previous session's copy as recovery\workspace.previous.isberg, so the automatic saves of the new session cannot replace it. Restore recovery opens that previous-session copy. It is replaced at the next start.

Tip. Recovery is a safety net, not a save. Save important work as a project. If you need an older session than the last one, copy workspace.previous.isberg somewhere else before you start Isberg Labs again.
  • If the recovery copy cannot be restored at startup, Studio protects it: automatic saves stop replacing it, and closing reports "The previous workspace could not be restored. Open a project before replacing its recovery copy."
  • If the copy cannot be written when you close, Studio asks "Recovery could not be written. Close without saving this workspace?"
  • Before closing, Studio shuts down loaded Lua extensions in Pixel & animation and reports any errors.
  • Some editors also keep their own autosave, such as Recover Autosaved Sprites… in Pixel & animation (see Pixel & animation).

The recovery copy travels with the portable Data folder. MCP clients can locate and restore it with workspace_recovery.

Data and Projects folders

The portable folder contains two working folders next to Isberg Labs.exe.

Data

Data is the portable profile. Keep it with the application folder to retain your settings. Projects do not depend on it, because .isberg files embed their assets.

Item in DataHolds
Local Storage (and other browser storage folders)Local preferences, layout and editor settings.
recovery\The automatic recovery project.
ProjectBlobs\A cache of project data blocks. It can be rebuilt from any saved project.
desktop-windows.jsonPlacement of the main window and of editors on other monitors.
license.jsonThe license record of this installation. See License.
lua-plugins\, palettes\, scripts\, styles\Lua extensions, palette library, scripts and style cards of Pixel & animation.
Cache foldersRendering and shader caches of the bundled desktop runtime.

Projects

Projects is an empty folder suggested for your projects and exports. The supplied mcp-config.json sets it as the MCP server's working folder through GAMEBENCH_WORKSPACE; see MCP server guide. Studio itself does not require you to use it.

Games you export keep their own saves inside the game's folder; they do not use Studio's Data.

Isolated profiles

Set the GAMEBENCH_PROFILE environment variable to use a different profile folder instead of Data, for example to test with clean preferences or to keep two setups apart. The folder is created if it does not exist; a relative path is resolved from the current folder. Preferences, recovery, the block cache, desktop window placement and the Pixel & animation libraries then live in that folder.

set GAMEBENCH_PROFILE=D:\Isberg profiles\testing
"D:\Isberg Labs 0.21\Isberg Labs.exe"

In PowerShell:

$env:GAMEBENCH_PROFILE = 'D:\Isberg profiles\testing'
& 'D:\Isberg Labs 0.21\Isberg Labs.exe'
Note. The license record always stays in the Data folder beside the executable and is shared by every profile. The variable keeps its earlier GAMEBENCH_ name for compatibility.

Shared assets and linked revisions

Editable documents can move between editors through the asset shelf. A shared document keeps its full editable source, and each editor that uses it is linked to a revision.

  1. In the source editor, press Share document. The editor's complete document is added to the shelf ("name is available in project assets.") and the editor is linked to it.
  2. Open the target editor, select the document on the Assets tab and double-click it or press Use selected image. The document is converted for that editor, replaces its content and links the editor to the asset.
  3. After editing in any linked editor, press Update asset. The asset's revision number goes up and every other linked editor that still holds the previous revision receives the new one.

Conflict protection

  • Studio records a fingerprint of what each linked editor received. When you update an asset, an editor whose content no longer matches (because you edited it locally) is not overwritten: its edits are kept and the conflict is recorded on its link.
  • Using a document from the shelf by double-click or Use selected image is an explicit replacement and overwrites the target's local edits. Undo restores them.
  • Through MCP, applying an asset to an editor with local edits fails with "editor has local edits. Update the shared asset from that editor, or explicitly replace it." unless you pass force.

What can be transferred

FromToWhat transfers
3D scene & animation, Formats & interchange, Level & playtest, Vertex painter, Tile modelerAny of those editorsEditable geometry, hierarchy, materials, rigs and animation. Tile modeler and Vertex painter receive editing views of the scene; the original scene is kept. Optional: rectangular surface guides for Tile modeler, an explicit projection or voxel bake into a static atlas, or appending one scene to another with new IDs.
Pixel & animation, Sprite lighting, Avatar stage, Textures & terrain, Tile modeler, Shader editors, scene editorsPixel & animation, Sprite lighting, Avatar stage, Textures & terrain, Tile modeler, Shader materials, scene editorsAn image: the composited current frame of a sprite, a lighting source or generated map, an avatar sprite sheet, a texture, an atlas or a material texture. Pixel & animation receives it as a new tab; Textures & terrain needs an open project.
Shader graph, Shader materialsScene editors, Shader graphValidated shader source assigned to or taken from a material. A graph stays restorable after its generated shader text was edited.
Script workspaceScene editors, JavaScriptScript source, language and exported properties on a node, or ready JavaScript modules copied unchanged. No automatic language translation.
JavaScriptScene editors (and back)The game scene with the complete module map and game state.
Sound designer, Parameter sound, Music & composition, Audio workshopMusic & composition, Audio workshopA rendered mono or stereo PCM bounce, added as a source or clip.
A converted documentIts original editorThe exact original document, restored from the retained source.

Each conversion keeps the full source document inside the result, so a chain of conversions can always go back. Conversions report notes and warnings, which MCP returns as diagnostics. A conversion does not mean the target can run every feature of its source. For all adapter names and options, see asset_document_adapters.

Limits. At most 64 source documents are kept in one conversion chain; start a new asset for longer chains. Images are limited to 16 million pixels and embedded PNG, JPEG or WebP. Compositing a sprite frame flattens its visible layers (the original sprite keeps its layers, frames and palettes). Audio Workshop accepts at most 180 seconds and 12 imported sources, and may sound different because it applies its own master processing. Pixel & animation holds at most 100 tabs. There is no audio-to-geometry conversion and no inference of synth settings from recorded audio.

Dependencies and removal

  • Assets can declare which other assets they depend on (through MCP, asset_document_dependencies). Missing references are reported as warnings and dependency cycles are refused.
  • Removing an asset that others depend on requires force (asset_document_remove). The Assets tab has no remove button; Undo removes a document you just shared.
  • Shared documents are embedded in the project, so they do not depend on the file they came from.

Shared Undo/Redo and the History dock

All editors share one history. It records editor changes, asset shelf changes, project name changes and window layout changes as atomic steps.

  • Undo and redo with the header ↶ and ↷ buttons, Ctrl+Z and Ctrl+Y (or Ctrl+Shift+Z), or the Undo and Redo buttons of the History tab.
  • A step is recorded when you finish a gesture in an editor (release the mouse, change a value, release a key). Typical labels are "Edit editor", "Arrange window", "Apply style preset", "Add shared document", "Update shared document", "Use asset in editor", "Remove shared asset" and "Import editor preset".
  • A change that touches several editors (such as an asset update that reaches linked editors) is one step.
  • If an operation fails, every editor it touched is put back. If an undo fails part-way, the editors already restored are rolled back and the history position is unchanged.
  • The history keeps at most 120 steps and 128 MB; the oldest steps are dropped first. The History tab shows the current size.
  • The history, including the redo branch, is saved with the project and restored when you open it.
  • Editors on other monitors take part in the same history.
Note. Many editors also have their own Undo/Redo buttons for fine-grained local steps. The native engine editor in Game runtime keeps its own engine undo history; its synchronized project files additionally enter the shared history. Restoring a native project from history leaves it stopped until you press Run or Edit project.

Bundles, archives and ZIP

Project bundles (.isbundle)

A bundle packs a project folder of ordinary files into one hashed JSON file, for example to hand a set of exports and sources to another computer. Bundles are created and unpacked through MCP:

  • project_pack packs a folder (or an explicit list of files) into an .isbundle. Every file is stored with its size and SHA-256 hash. Limits: 2,000 files, 192 MB of source data, and a folder scan of at most 20,000 entries (supply a file list for larger folders). Only regular files are included.
  • project_unpack checks every path and hash before it writes anything. Existing files are only replaced with overwrite. Bundles named .gbundle from earlier versions still unpack.

A bundle is not a Studio project; use .isberg for the workspace itself.

Project data blocks

workspace_project_archive inspects an .isberg file and imports or exports individual content-addressed data blocks as local files, without sending their bytes through MCP.

ZIP and PCK archives

  • archive_inspect and archive_extract_zip read local ZIP and ZIP64 archives with stored, Deflate or Zstandard entries, UTF-8 and CP437 names and self-extracting prefixes. Large archives stream from disk instead of loading into memory.
  • Passwords you supply decrypt traditional ZIP encryption and AES (128, 192 or 256-bit). No password search is attempted, and passwords are not logged.
  • Extraction refuses unsafe paths (traversal, absolute, device or stream paths), duplicate destinations, symbolic links and existing files, and verifies each file's size and checksum before it is written. Defaults allow up to 1 TiB per entry and in total. Split archives must be joined first; unsupported compression or proprietary encryption is reported, not guessed.
  • archive_extract_pck and archive_stage_project read engine PCK packs (versions 1 to 3, also embedded in executables) and stage a folder, ZIP or PCK as a project. Executables are never launched and scripts are not run during extraction.
  • Game runtime opens a project folder, project.godot, ZIP or PCK directly. See Game runtime.

The ZIP files that editors export are listed in Archives.

File extensions

Isberg Labs writes its documents with the Isberg extensions below. Every reader also accepts the names used before 0.20. Reference-tool files (such as Aseprite or Laigter files) are import-only; see Isberg documents and import-only formats.

DocumentExtensionEarlier names (still open)Written by
Complete workspace project.isberg.gbench, .veldryneSave project, automatic recovery
Pixel sprite or animation.isbsprite.gbsprite, .pforgePixel & animation
Editable tile-model project.isbtiles.gbtilesTile modeler, Formats & interchange
RPG project.isbrpg.gbrpgRPG Creator
Sprite-lighting project.isbmaterial.gbmaterialSprite lighting
Sprite-lighting preset.isbpreset.gbpresetSprite lighting
Parameter sound.isbsound.gbsoundParameter sound
Avatar rig.isbavatar.gbavatarAvatar stage
Tile clipboard.isbtileclip.gbtileclipMCP pixel_tile_copy
Project bundle.isbundle.gbundleMCP project_pack
Scene painter document.isbscene.gbsceneMCP scene painter tools

Save dialogs check typed file names: an Isberg document must keep its own extension, an Isberg extension cannot be used for another kind of file, and reference-tool extensions are refused for output. Files you exported earlier are never renamed or deleted. Other editors save descriptive JSON documents, such as .scene3d.json, .level.json, .music.json and .shader-graph.json; see File formats reference.

What the portable folder includes

The portable folder is complete: it needs no installer and no separate Node.js, npm, source editor, external authoring program or API key. It bundles:

  • the desktop runtime and its libraries, including a software Vulkan renderer;
  • the native game engine with its .NET runtime and C# compiler, a C compiler for GDExtension libraries, Lua 5.4 and its native extension;
  • the official export editor and export templates for Windows, macOS, Linux, Android and iOS, plus a portable JDK 17, Android SDK tools and bundletool;
  • image libraries, format decoders (including Draco and Zstandard) and a local media encoder for OGG, FLAC, MP3 and MP4;
  • the WebAssembly editor and player, and the RPG Creator player runtimes for exported games.

Isberg Labs assumes 64-bit Windows 10 or 11 with the Universal C Runtime that is part of Windows. A static audit of every bundled program file found no missing third-party libraries: dependencies are resolved only from files inside the folder, never from the system PATH or separately installed runtimes. Media Foundation is treated as an optional Windows feature (absent on Windows N and KN editions unless you add the Media Feature Pack).

Exported Windows games are self-contained too. A JavaScript game can read and write only its own Data\Saves\game.json (at most 16 MB). Web-only exports keep saves in the browser's local storage, which persists only for the same browser profile and address.

Limits. This is static dependency evidence, not certification on a fresh Windows installation. GPU drivers, optional graphics backends and edition-specific media components are only exercised at run time.

MCP tools

Troubleshooting

"This is not a compatible project."
The file is not an Isberg project (or is damaged). Check that you chose an .isberg, .gbench or older project file.
"Unknown project workspace: …" or "Unknown layout workspace: …"
The project refers to an editor this version does not have. It was probably written by a different version.
"Project manifest checksum mismatch." or "Project archive is truncated."
The file was damaged or only partly copied. Use another copy or the recovery project.
"Project restore failed and rollback reported: …"
Both the project and the return to your previous workspace failed. Do not save over your project file; restart Isberg Labs and open the project again.
"editor has local edits. Update the shared asset from that editor, or explicitly replace it."
The target editor was edited since it last received the asset. Press Update asset in that editor to keep its version, or replace it explicitly.
"Other assets depend on this asset."
Remove the dependency first, or remove with force.
"Asset dependency cycle: …"
The dependencies you set would loop. Change them so no asset depends on itself through others.

Game presets

Game presets give an editor a coordinated starting point for one of ten game types: palettes, surfaces, timing, sounds or generated layouts. Nineteen editors support them through one shared dialog, and each applied preset is an undoable step saved with the project. Presets are starting content, not finished game systems.

Applying a preset

  1. Open the editor you want to change and make it the active editor.
  2. Press Game presets in the workspace bar. The dialog names the active tool (by its internal ID, for example "Active tool: scene3d").
  3. Choose a Game type. The dialog shows the type's description and what applying it will do in this editor. Choosing a type alone changes nothing.
  4. Enter a Seed (whole number from 0 to 4294967295; default 1).
  5. Press Apply to this tool. The status line reads "Applied. Use project Undo to restore the previous state."
  • A preset changes only the active editor. Other editors keep their content, and each editor can carry a different game type.
  • The application is one shared-history step named "Apply style preset". Undo restores the previous state.
  • The applied recipe (editor, game type, seed and recipe version) is stored with the editor's document and saved in .isberg projects. When you reopen the dialog, it shows that editor's last applied type and seed.
  • On the Overview, and in RPG Creator, the button reports "Open a tool to choose its game presets." RPG Creator has its own editable starter adventure and blank projects instead; see RPG Creator.

The ten game types

Game typeDirectionFrame rate used
Retro platformerBright, readable shapes, brisk movement and short arcade cues.12 fps
Fantasy RPGWarm towns, organic materials, exploration and melodic feedback.24 fps
Dungeon crawlerCompact chambers, stone surfaces, low light and resonant rewards.24 fps
Sci-fi shooterClean sightlines, cool metal, fast movement and sharp electronic cues.60 fps
Survival horrorConstrained routes, muted surfaces, deliberate movement and sparse audio.24 fps
StealthAlternate routes, low contrast environments and restrained movement.30 fps
Cozy simulationOpen village spaces, soft surfaces, gentle motion and warm sounds.30 fps
Strategy / tacticsReadable regions, overview cameras, grid-friendly assets and clear alerts.30 fps
RacingOpen circuits, high visibility markings, reflective surfaces and energetic cues.60 fps
PuzzleCompact spaces, strong color grouping, precise movement and soft feedback.30 fps

Each type also defines a four-color palette, movement and jump speeds, surface roughness and metalness, a preview resolution and a fog amount. Dungeon crawler, Survival horror and Stealth count as low-light types, which several editors use for darker lighting. Some editors show slightly different names: the Level editor uses Strategy, Racing circuit and Puzzle exploration, and World builder uses Puzzle / adventure.

What each editor does

These are the nineteen editors with presets and what Apply to this tool changes. "Replaces" means the editor's current content is replaced (Undo restores it).

EditorEffect of applying a preset
Pixel & animationSets the sprite's palette to the type's four colors and every frame's duration to the type's frame rate (83 ms at 12 fps, 42 ms at 24 fps, 33 ms at 30 fps, 17 ms at 60 fps). Pixels are kept.
Textures & terrainSets Render resolution (240p for Retro platformer, 480p for Fantasy RPG, Dungeon crawler and Survival horror, 720p otherwise), Scene lighting (Moonlight for low-light types, Golden hour for Fantasy RPG, Daylight otherwise), Atmospheric fog, Affine mapping and Vertex snap (on for Retro platformer) and Selection outline (on for Strategy and Puzzle).
World builderReplaces the active map editor's map with a generated starting map. See World builder styles.
3D scene & animationSets the background, ambient light and fog, recolors the materials with the palette, sets their roughness and metalness, and recolors the lights (dimmer for low-light types).
Tile modelerApplies the same material palette and surface response to the current model.
Formats & interchangeApplies the same material palette and surface response to the loaded scene.
Vertex painterSets the swatches to the palette, the brush color, the brush size (larger for Strategy, smaller for Puzzle) and opacity, and the background. Mesh geometry is kept.
Sprite lightingSwitches to a custom profile and sets normal strength, blur, occlusion strength, specular and specular contrast, and preview lighting: ambient, intensity, light color, background, toon shading in three steps (Retro platformer, Cozy simulation, Puzzle) and pixelated preview (Retro platformer). Resets the preview to one light.
Avatar stageSets blink cadence and duration (seeded), timing and output frame rate, output filtering (off for Retro platformer), microphone noise gate and release, and motion bounce and gravity. Rig layers are kept.
Audio workshopReplaces the current sound with a genre-specific sound recipe (the interface event). See Audio presets.
Sound designerReplaces the current settings with a genre-specific sound recipe (the interface event) using the seed.
Parameter soundReplaces the current sound with a genre-specific editable parameter sound (the interface event).
Music & compositionReplaces the composition with a genre-specific editable music sketch.
Level & playtestReplaces the level with a generated game layout (standard difficulty, scale 1). See Level layouts.
JavaScriptAdds a configuration module gamebench-presets/type.mjs (numbered -2, -3 … if it exists) that exports the type, seed, palette, move speed, jump speed and frame rate, and stores the type, seed and speed in the initial game state. Your modules are not overwritten; import the new module from your entry module to use it. The module is selected in the editor, and any saved checkpoint and snapshot are cleared.
Script workspaceReplaces the script with an editable GDScript movement script (an exported speed set from the type, moving along the move_left/move_right input axis) and sets the step time from the frame rate. Level geometry is kept; the previous script text is replaced.
Game runtimeGenerates the matching level layout and stages it as an editable native (or web) project for the current backend. It does not start the game; press Run or Edit project yourself.
Shader graphReplaces the graph with a new "type material" graph: a palette color, the type's roughness and metalness, unshaded for Retro platformer.
Shader materialsReplaces the shader with a new "type material" spatial shader with a base_color uniform, roughness and metalness (unshaded for Retro platformer), previewed on a sphere.

Seeds

  • The seed makes generated content reproducible: the same game type, seed and recipe version create the same result. Change the seed to get a different variation.
  • The shared dialog accepts whole numbers from 0 to 4294967295 (default 1). Anything else is refused with "Seed must be an integer from 0 to 4294967295."
  • Seeds matter most where content is generated: World builder, Level & playtest, Game runtime and the four audio editors. Avatar stage uses it for blink timing, and JavaScript stores it in the configuration module. Editors that only change palettes or settings ignore it.
  • The World builder's own panel accepts text seeds of up to 128 characters (default gamebench-1); the Level editor's Generation seed field is also text.

Exporting and importing presets

The Game presets dialog has three file actions.

ButtonWrites or readsDetails
Export recipeeditor-type.game-preset.jsonA small recipe: editor, game type, seed and recipe version. It contains no content.
Export current tool preseteditor.tool-preset.jsonThe editor's complete current content and settings, up to 64 MiB. Disabled for Game runtime ("Use Save project to embed native project assets.").
Import preseta .json file of either kindA recipe fills the Game type and Seed fields ("Recipe loaded. Apply to this tool when ready."); press Apply to this tool to regenerate. A tool preset replaces the editor's state as one undoable step ("Tool preset imported. Project Undo restores the previous state.").
  • A preset file belongs to one editor. Importing it into another editor fails with "This preset belongs to editor. Open that tool before importing."
  • Files larger than 64 MiB are refused ("Preset exceeds 64 MiB. Use a project archive for larger documents."). Use a full project for large documents and for Game runtime projects, so their referenced assets are embedded.

Audio presets and delivery

Audio workshop, Sound designer, Parameter sound and Music & composition each have a Game style & delivery panel with more control than the shared dialog. See Audio for the editors themselves.

ControlValues (default first)Purpose
Game styleThe ten game typesGenre of the generated sound or music.
Event (not in Music & composition)interface, pickup, jump, impact, weapon, footstep, ambience, victoryWhich game event to synthesize.
Seed0 to 4294967295 (1)Same seed, same sound; neighbouring seeds give variations.
Apply game sound / Apply game musicReplaces the current sound or composition with editable settings. Choosing options alone changes nothing.
PCM bits24, 16Bit depth for the delivery and bank exports.
Delivery Hz48000, 44100, 22050, 96000Sample rate for the delivery and bank exports.
Peak dBFS−3, −6, −1Sample-peak headroom.
Taper loop edgesoffApplies a 10 ms edge taper for loops without changing the frame count, and writes the loop bounds into the recipe.
Export game WAV + recipeWrites game-audio-delivery.zip with sound.wav (your current audio) and recipe.json (source settings, processing and measurements).
Variations3, 1, 2, 4, 8Variations per event for the bank.
Export event bank ZIPWrites style-sound-bank.zip: WAVs for all eight events in style/event folders and a manifest with the exact synthesis settings, seeds, frame counts, channel counts, sample peaks, RMS and delivery format. It does not change your current sound.
  • The shared Game presets dialog uses the interface event for the three sound editors. Use the editor's own panel to pick another event.
  • Styles change oscillator choice, pitch motion, harmonic intervals, envelopes, filtering and space. Audio workshop's library additionally offers 80 editable game-event entries (ten types × eight events).
  • Delivery processing removes the DC offset, converts the sample rate when needed and applies short edge fades (3 ms, or 10 ms with Taper loop edges).
  • Parameter sound keeps its own 22.05/44.1 kHz and 8/16-bit controls and legacy setup behavior; the delivery export converts its rendered audio to the chosen format. A higher bit depth cannot recover detail the source already lost.

Music presets and stems

Music presets create editable Foundation, Exploration and Action tracks with genre-specific tempo, notes, rhythm and timbre. In Music & composition, Export synchronized stems ZIP renders the mix and each audible track with a common start, sample rate and length, honoring mute and solo, without per-stem normalization, and includes the composition and a timing manifest (game-music-stems.zip). Cancel render stops it.

Limits. Stem exports allow at most 64 audible tracks, a predicted 96 MiB of WAV data and a 128 MiB archive. Summing stems of a clipped mix does not necessarily reproduce the mix exactly. Peak and RMS readings are sample-based, not LUFS or true-peak measurements. Loop tapering avoids clicks but can dip the level at the loop point and does not beat-match or make ambience seamlessly periodic.

Level layouts

The Level & playtest editor generates real geometry, movement settings, pickups, checkpoints and a goal. Its controls are Game style (the list shows the type IDs, such as retro-platformer), Generation seed (default 1), Difficulty (relaxed, standard or challenging; default standard) and Layout scale (0.75 to 2; default 1), followed by Generate game layout. The four neutral templates (blank, platformer, landscape, interior) remain under New from template.

Game typeLayout and starting behavior
Retro platformerRising jump platforms, collectibles and a midpoint checkpoint; third-person camera and jumping.
Fantasy RPGVillage square, main road and an exploration pickup; return to the entrance to complete the route.
Dungeon crawlerConnected chambers, doorways, pillars and a key-gated exit; top-down camera.
Sci-fi shooterSymmetrical arena cover, side lanes and health pickups; first-person movement.
Survival horrorCorridor with side rooms, safe-room checkpoint, exit key, limited sprint and an optional torch.
StealthAlternating sightline screens, low cover, a crouch passage and a retrieve-and-return route.
Cozy simulationHomestead, gardens, gathering pickups and a delivery goal.
StrategyMirrored bases, resource landmarks and a central objective; top-down map inspection.
Racing circuitClosed circuit with three ordered checkpoints before the finish; on-foot route inspection.
Puzzle explorationThree chambers with required collectibles before the exit completes.
  • Generation is undoable. Seed, difficulty, scale and recipe version are saved in the level and survive saving, opening and export.
  • The same recipe, seed, difficulty and scale recreate the same level. Seeds vary scenery and cover placement. Difficulty adjusts movement speed and how close you must get to objectives and checkpoints; Retro platformer, Dungeon crawler, Sci-fi shooter and Stealth also change route geometry or obstacle count.
  • Checkpoints and goals activate when you come near them in local playtest. Each has a radius and a list of required objects (pickups collected, checkpoints activated, goals completed). Respawn returns you to the last checkpoint and restores health and stamina; falling out of the world does the same. A new playtest resets progress.
  • Generating a layout switches to local playtest. The native engine playtest does not implement these checkpoint and goal components; write equivalent scripts in the native project.
  • Check level inspects spawn clearance and support, missing, inactive, self-referencing or cyclic requirements, triggers inside colliders, unresolved objects, object and collider budgets, and shapes that use simplified box collision. Export check report saves the result as level.preflight.json (units in metres, Y up).

See Level & playtest for the editor.

World builder styles

World builder has its own preset bar above its four map editors (Town, Buildings, Terrain and Floor plan): Game style, Seed, Generate game preset, Undo preset, Save editable world and Open editable world.

  • Generate game preset replaces the active map editor's map. The other three editors keep their work. The shared Game presets dialog does the same for the active map editor.
  • Undo preset restores the map from before the last generation, including its edited native state. It keeps one step.
  • Town recipes change settlement layout, street density, curvature and width, connectivity, terrain, water, vegetation and map presentation.
  • Buildings recipes change district type, zoning, architecture, density, wear, scene lighting and streets.
  • Floor plan recipes change dimensions, footprint, floor and basement counts, difficulty, encounters, resources, doors and room vocabulary. Cozy simulation turns combat encounters off.
  • Terrain recipes generate distinct terraces, valleys, craters, arenas, marshes, compounds, meadows, tactical terrain, circuits and islands on a fixed two-metre height grid in metre coordinates. Starter roads are graded; Racing includes a closed route; Strategy / tactics has opposing approaches and objective labels (labels only: no teams, navigation or scoring). Height grids, surfaces, props, roads and labels stay editable.
  • Save editable world writes all opened map editors, their generated geometry and recipe seeds to gamebench-editable-world.json. Open editable world checks the file and its terrain grid before restoring it. Full project saves include the same data. The per-editor PNG, SVG and OBJ exports do not contain the editable recipe.

See World builder for the map editors.

Limits

Limits. Presets create repeatable starting content and hand-off files. They do not supply genre systems: combat, AI, stealth perception, unit or economy simulation, vehicle physics, puzzle mechanisms, navigation, balancing and final audio mastering remain part of your game project. Level and terrain checks are static; they do not prove route reachability, collision-free prop placement, encounter balance or runtime performance. Raster textures from the map renderers are not guaranteed pixel-identical across graphics drivers. Level checkpoints and goals need equivalent scripts in exported native games.

MCP tools

Pixel & animation

The Pixel & animation editor is a layered sprite editor with a frame timeline, palettes and indexed color, tilesets and tilemaps, slices, deterministic repair tools, art-as-code workspaces, Lua scripting and a batch command line. Editable sprites save as .isbsprite; finished art exports to PNG, GIF, APNG, WebP, sprite sheets and other formats.

Layout and workspaces

Open the editor from the studio's Pixel & animation workspace (▦). Its top bar holds the menu bar (File, Edit, Sprite, Layer, Frame, Select, View, Filters, Help), a row of mode buttons, and the ⌘ command palette button.

Mode buttons

Each mode button switches the whole editor view. Everything you build in a mode ends up in the Editor as a document tab.

ModeWhat it is forSee
EditorDraw, animate and edit sprites.most of this chapter
Grid repairSnap enlarged or blurry pixel art back to its true pixel grid.Repair workspaces
PixelizerTurn any image into pixel art.Pixelizer
RipperUnwarp a surface from a photo into a flat texture.Texture Ripper
VideoSample video frames into a pixel animation with one shared palette.Video
TilesTilesets, autotiles and tile maps.Tilesets and tilemaps
SpecSprites described as JSON shapes, ramps and poses.Art as code: Spec
CodeSprites written in the PXL language (.px.js).Art as code: PXL
BatchRun a re-runnable recipe over many files.Batch workspace

Editor layout

  • Toolbar (left): tool buttons, a block of view toggles, and the primary (left-click) and secondary (right-click) color swatches. See Drawing tools.
  • Context bar (above the canvas): the active tool's options on the left; Symmetry, Tiled, ◐ Onion… and ▦ Grid… on the right. While a selection is floating it also shows ⇋, ⇵, Transform…, ✓ and ✕.
  • Document tabs: one tab per open sprite. See Documents, tabs and saving.
  • Canvas and the status bar: cursor position, sprite size with frame n/N, zoom (plus the pixel ratio when it is not square), the color under the cursor, and status messages.
  • Timeline (bottom): frames, layers, cels and tags. Drag its top edge to resize it. See Timeline.
  • Panels (right), in this order: Palette, Layers, Color, Body parts (anatomy fix), Fix & clean, Animation, Textures, Tilemap, Slices, Style library, History, Analyze. Click a panel title to collapse or expand it; the editor remembers which panels are open. Animation, Tilemap, Slices, Style library, History and Analyze start collapsed.

Command palette

Open it with Help > Command palette (Ctrl+Space) or the ⌘ button. Every menu item is also a command named Menu: Label (for example File: Export As…), and so are tools, palette actions and commands that have no menu entry. Type words to filter, use ↑/↓ to choose and Enter to run.

  • Start the text with = to evaluate an arithmetic expression.
  • Start it with > to run JavaScript against the editor (ctx, C, ed). This is trusted local code with full access to the editor.

Help > Developer tools (F12) reminds you that F12 opens the developer console.

Documents, tabs and saving

New sprites

File > New… (Ctrl+N) asks for Width (default 64), Height (default 64), Color mode (rgb, indexed, grayscale) and Pixel ratio (1:1, 2:1, 1:2). An indexed sprite takes the current palette.

Document tabs

  • Each tab keeps its own document, undo history, frame and layer, selection, zoom and pan. A dot (•) marks unsaved changes; undoing back to the saved state clears it.
  • Click a tab to activate it, middle-click or click × to close it, and drag tabs to reorder them. The mouse wheel scrolls the strip.
  • + or a double-click on empty strip space runs File > New….
  • File > Close (Ctrl+W) and Close All (Ctrl+Shift+W). View > Next document tab (Ctrl+Tab) and Previous document tab (Ctrl+Shift+Tab).
  • Closing a tab with unsaved changes asks Don’t save, Cancel or Save. Quitting asks the same for each changed tab; Cancel stops the quit.
  • Closing the last tab opens a fresh 64×64 Untitled sprite. An untouched, blank Untitled tab is replaced by the next document you open.

Opening files

  • File > Open… (Ctrl+O) opens any supported file in a new tab. If the file is already open with unsaved changes, that tab is shown instead.
  • File > Open Recent… picks from the last 12 files.
  • Drop one file on the window to open it. Drop several images to import them as one animation (100 ms per frame, aligned top-left).
  • Import warnings (for example about an embedded profile) appear as a toast for a few seconds.

See Opening and importing for every format.

Saving

  • File > Save Project (Ctrl+S) writes the editable .isbsprite document: layers, groups, frames, cels, tags, slices, palettes, tilesets, metadata and precision planes. If the tab came from a PNG or another format, you are asked for a new .isbsprite path.
  • File > Save Project As… (Ctrl+Shift+S) always asks for a path.
  • Older .gbsprite and .pforge documents still open. Aseprite .ase/.aseprite files open but cannot be written; save them as .isbsprite.

Live reload

Open files are watched. When a file changes on disk (for example, an MCP tool wrote it) its tab reloads and the toast reads “Reloaded — file changed on disk (Ctrl+Z to undo)”. The reload is one undo step.

Sprite properties and pixel ratio

Sprite > Properties… (Ctrl+P) shows the size, frame and layer counts and color mode, and lets you edit Pixel aspect ratio, Grid width, Grid height and User data (a plain text string).

Sprite > Pixel ratio sets 1:1 (square pixels), 2:1 (wide pixels) or 1:2 (tall pixels). The canvas stretches pixels on screen; the image data stays one pixel per pixel. The change is undoable.

Limits. Exports do not apply the pixel ratio. A 2:1 sprite exports at one output pixel per sprite pixel; scale it yourself if the target needs the stretched look.

Undo and history

Edit > Undo (Ctrl+Z) and Redo (Ctrl+Y or Ctrl+Shift+Z). The History panel lists Initial state and every step with its time; click a step to jump to it, or use its ↶ and ↷ buttons. Edit > Undo history… opens the panel.

Autosave and recovery

  • Every changed tab is autosaved for crash recovery, by default every 2 minutes. File > Autosave Settings… sets Every N minutes (0 = off).
  • Recovery files live in the Data\recovery folder of the portable profile. The 20 most recent sessions are kept. Saving a document deletes its recovery file.
  • If recovery files exist at startup, a card titled “Recover unsaved work?” appears. Restore opens a sprite as a new untitled tab; Delete removes that file; Delete all empties the recovery folder; Later closes the card. File > Recover Autosaved Sprites… shows the card again.

Canvas and view

Zoom and pan

  • Mouse wheel zooms around the cursor; Shift+wheel pans horizontally.
  • View > Fit to window (0), Zoom in, Zoom out. The Zoom tool (Z) zooms in on click and out on right-click or Alt+click.
  • Pan with the middle mouse button, by holding Space and dragging, or with the Hand tool (H). Tapping Space without dragging plays or stops the animation.

Grids and snapping

  • View > Toggle pixel grid (#) and Toggle tile grid (Ctrl+').
  • View > Grid settings… (also ▦ Grid… in the context bar): Width and Height (default 16), Offset X, Offset Y, Color (hex) (default #ffffff), Opacity % (default 22) and Show tile grid. The tile grid is stored in the document.
  • View > Snap to grid (Shift+') snaps shapes, selections, moves and reference placement to the tile grid.
  • Select > Selection as grid turns the current selection rectangle into the tile grid.

Symmetry

Choose Symmetry in the context bar: off, horizontal, vertical, both, diagonal /, diagonal \, both diagonals or all (8-way). The View menu offers the same modes except both diagonals, plus Symmetry: reset axis to center. Drawing tools, fills and shapes are mirrored. Drag the axis handle above or beside the canvas to move an axis; it snaps to half pixels.

Tiled mode

Tiled in the context bar, or View > Tiled mode: none, x, y or both, wraps drawing across the chosen edges so you can paint seamless tiles. The paint bucket also works outside the canvas in tiled mode.

Palette lock

View > Snap colors to palette (palette lock) (toolbar 🎨) snaps every drawn color to the nearest palette entry. Indexed sprites always snap to their palette.

Onion skin

View > Toggle onion skin (F3) shows neighboring frames. View > Onion skin settings… (or ◐ Onion…) sets:

FieldDefaultMeaning
EnabledyesTurns onion skin on.
Previous frames / Next frames1 / 1How many frames to show before and after.
Opacity %45Opacity of the nearest frame (2–100).
Opacity step %15Opacity lost per further frame.
Typemergemerge shows the frames as they are; tint colors them.
Current layer onlynoShow only the active layer's cels.
Loop through tagnoWrap around inside the current tag.
Positionbehindbehind or in front of the current frame.

Preview window

View > Preview window (F7) opens a floating, resizable animation preview. View > Preview: follow current frame (Ctrl+F7) toggles following.

  • Title bar: − and + zoom (1–64×), fit, × close.
  • Bottom bar: play/pause, follow (plays the tag under the current frame and mirrors the main playback), a tag selector used when not following (all (tags), all frames or one tag), and the frame counter.
  • The wheel zooms. Position, size, zoom and follow state are remembered. Playback uses the timeline speed and honors tag repeats.

Drawing tools

Tools that share a toolbar button form a group. Click a group button to use its last tool; right-click it, or hold it down, to open a fly-out with the other tools. The active tool's options appear in the context bar and are remembered between sessions. Tool keys are defaults: you can change them in Keyboard Shortcuts.

ToolIconKeyWhat it does
Rectangular marquee⬚MRectangle selection. Drag inside a selection to move its pixels; hold Ctrl to move a copy.
Elliptical marquee◌Shift+MEllipse selection.
Lasso➰QFreehand selection.
Polygonal lasso⟁Shift+QClick points; Enter, a double-click or clicking the first point closes it.
Magic wand✧WSelects a color region, using the fill options.
Move✥VMoves the selection, or the whole cel when nothing is selected. Alt+drag on a selection moves a copy. Ctrl+click picks the topmost layer with a pixel under the cursor. On a reference layer it moves or resizes the reference image.
Pencil✎BFreehand drawing with the brush and ink.
Spray⁘Shift+SSprays random dots inside a radius while the button is held.
Eraser⌫EErases to transparent. Right-click replaces the primary color with the secondary color.
Eyedropper⌖IClick picks the primary color, right-click the secondary. Alt+click does the same while the pencil, spray, eraser, blur, jumble or paint bucket is active.
Paint bucket◩GFlood fill.
Gradient▤Shift+GDrag from the start to the end color (primary to secondary; right-drag reverses). Shift snaps the direction to 15° steps.
Noise fill (seeded)░–Fills the area with seeded noise between the chosen colors.
Voronoi fill (seeded)⬡–Fills the area with seeded Voronoi cells.
Line╱LStraight line; Shift snaps to 15° steps.
Curve∿Shift+LDrag the line, then drag the first and the second control point.
Rectangle▭URectangle; Shift makes a square, Alt draws from the center.
Ellipse◯Shift+UEllipse; Shift makes a circle, Alt draws from the center.
Triangle△–Triangle; Shift makes equal sides, Alt draws from the center.
Rotated rectangle◇–Rectangle rotated by the Rotation option.
Circle by radius⊙–Drag from the center outward.
Contour✐DDraw a freehand outline; it is closed and filled.
Polygon⬠Shift+DClick points; click the first point, double-click or press Enter to close.
Blur💧RAverages pixels under the brush.
Jumble⁂Shift+RSwaps pixels randomly with near neighbors.
TextTTClick, type the text, then move it and press Enter. Bitmap pixel fonts or system fonts without anti-aliasing.
Hand (pan)✋HPans the view.
Zoom🔍ZClick zooms in; right-click or Alt+click zooms out.
Stamp body part◈PPlaces the part chosen in the Body parts panel. See Body parts.
Limb (drag joint to joint)⟋–Draws a shaded, outlined limb between two joints.
Slice tool⧈Shift+CDraw, move and resize slices. See Slices.
Tile brush▦–Draws tiles on a tilemap layer. See Tile brush.

Mouse and modifier rules

  • The left button uses the primary color; the right button uses the secondary color.
  • Shift+click with the pencil, eraser, blur or jumble draws a straight line from the last point.
  • X swaps the primary and secondary colors.
  • Enter commits a floating selection or finishes a polygon or curve; Esc cancels or deselects.
  • Drawing is refused on a hidden or locked layer (or one inside a hidden or locked group), on a reference layer, and on high-precision documents. The status bar says why.

Toolbar toggles

ButtonToggle
PPPixel-perfect strokes (the trace mode)
⇋Horizontal symmetry
■Filled shapes
#Pixel grid
▦Tile grid
◐Onion skin
⌗Snap to grid
🎨Snap drawn colors to palette

Tool options

Brush, ink, trace and “Only on” options are described in Brushes and inks. The other options are:

ToolOptionValues (default)
Paint bucket, Magic wandTolerance0–255 (0)
Contiguouson
Visible layersoff; on uses the composite of all visible layers as the boundary
8-connectedoff (4-connected)
Stop at gridoff; on stops the fill at tile grid lines
SprayRadius / Density1–64 (6) / 1–100 (6)
GradientTypelinear, radial
Dithernone, bayer2, bayer4 (default), bayer8
Gradient, Noise, VoronoiColorsFG + BG (default) or palette FG→BG (every palette entry between the two colors)
Areaselection / layer (default) or fill region (the region under the click, using Tolerance and Contiguous)
Noise fillScale / Seed1–64 (1) / 0–99999 (1)
Voronoi fillCell / Seed2–128 (8) / 0–99999 (1)
Rectangle, Ellipse, Triangle, Rotated rectangle, Circle, PolygonFilledoff
RectangleCorner radius0–64 (0)
Rotated rectangleRotation−180 to 180, step 5 (30)
EyedropperSamplecomposite (default, includes reference layers) or layer
Selection toolsModereplace, add, subtract, intersect
Transparent BG while movingoff; on drops pixels of the secondary color from the moved selection
MoveWrap / Transparent BGoff / off; Wrap moves the cel with wrap-around
TextFont3x5, 5x7 (default), system
Family / Sizesystem font only: text (Arial) / 4–128 (12)
Scalebitmap fonts only: 1–8 (1)

Brushes and inks

Brush

OptionValues (default)Notes
Brushcircle (default), square, line, customcustom uses the image brush made with Edit > New brush from selection.
Size1–64 (1)] bigger, [ smaller.
Angle−180 to 180, step 15 (0)Square and line brushes only.
Image brushStamp image (default), Paint brush (FG), Pattern: source, Pattern: destinationCustom brushes only. Stamp paints the brush's own pixels; Paint brush uses its shape in the primary color; the pattern modes tile the brush image aligned to where it was captured or to where the stroke starts.
  • Edit > New brush from selection (Ctrl+B) captures the opaque pixels of the selection or floating selection as a custom brush.
  • Edit > Flip brush horizontal, Flip brush vertical, Rotate brush 90° and Reset brush (circle, size 1). With a custom brush the context bar shows ⇋, ⇵ and ⟳ buttons.
  • Brush slots: the Slots… menu next to the brush, or Alt+1…9 to recall and Ctrl+Alt+1…9 to save. Slots, including custom image brushes, survive restarts.

Ink

Ink decides how the tool color is applied. Opacity (0–255, default 255) scales it.

InkEffect
Simple (default)Opaque colors replace the pixel; translucent colors or reduced opacity composite over it.
Alpha compositingAlways composites the color over the pixel.
Copy color+alphaWrites the color and its alpha exactly, including transparency.
Lock alphaRecolors only opaque pixels and keeps their alpha.
ShadingSteps the existing pixel along a palette ramp: left-click darkens, right-click lightens. Ramp chooses palette ramp of pixel (the hue ramp the pixel's color belongs to) or palette FG→BG (the palette entries between the two colors).
BehindPaints only under existing pixels; fully opaque pixels are left alone.

Only on

Only on limits where a stroke paints: everything (default), color… (only pixels of the color you pick next to it), opaque px or empty px. An active selection also limits every stroke.

Trace, stabilizer and dynamics

OptionValues (default)Effect
Tracedefault, pixel-perfect (default), dotsPixel-perfect removes the L-shaped corner pixels of 1-px strokes. Dots stamps only at the sampled pointer positions, without joining them.
Stabilizer0–64 (0)The stroke follows the cursor like a string of this length, smoothing shaky lines.
Dynamicsnone, pressure, velocityVaries the brush size with pen pressure or stroke speed.
Min1–64 (1)Smallest size when Dynamics is on.

Pencil and eraser have all of these options. Blur and jumble have brush, size, angle and opacity. Shapes and lines have brush, ink and “Only on”.

Note. On an indexed sprite, a stroke in a palette color records the exact palette index you clicked in the Palette panel, so duplicate palette entries stay distinct. See Color modes and indexed color.

Selections and transforms

Making selections

  • Use the marquee, lasso, polygonal lasso and magic wand tools. Hold Shift to add, Alt to subtract, Ctrl+Shift to intersect; otherwise the tool's Mode applies.
  • Ctrl+click a layer row in the Layers panel to select that layer's opaque pixels (Ctrl+Shift+click adds them).
Select menu itemKeyWhat it does
AllCtrl+ASelects the whole canvas.
DeselectCtrl+DClears the selection.
ReselectCtrl+Shift+DRestores the last selection.
InverseCtrl+Shift+IInverts the selection.
Color range…–Selects pixels of one color: Color (hex), Tolerance (0), Sample (layer or visible layers), Mode.
Cel content (current layer)–Selects the opaque pixels of the active cel.
Modify: border…, Modify: expand…, Modify: contract…–Grow, shrink or outline the selection by Pixels with a Brush of circle or square.
Selection as grid–Uses the selection rectangle as the tile grid.
New slice from selection–See Slices.

Moving and transforming

  • Drag inside a selection to lift and move its pixels (Ctrl with the selection tools, or Alt with the Move tool, moves a copy). The arrow keys nudge the selection by 1 pixel, or 8 with Shift; with the Move tool and no selection they nudge the whole cel.
  • Edit > Transform selection (Ctrl+T) shows handles. Drag a handle to scale (Shift keeps the ratio), drag just outside a corner to rotate (Shift snaps to 15°), and drag inside to move. Enter or ✓ commits; Esc or ✕ cancels.
  • Edit > Transform selection (numeric)… or Transform…: Scale X %, Scale Y %, Rotate (°), Flip horizontal, Flip vertical.
  • Edit > Flip selection horizontal and Flip selection vertical, or ⇋ and ⇵ in the context bar.
  • Scaling is nearest-neighbor. Rotations by multiples of 90° are exact; other angles use RotSprite when you release the handle (a fast preview is shown while dragging).
  • Switching to a drawing tool commits the floating selection.

Fill, stroke and clear

  • Edit > Fill selection (FG) (Alt+Backspace) and Stroke selection (FG) use the primary color.
  • Edit > Clear selection (Del) erases the selected pixels.

Clipboard

Edit menu itemKeyWhat it does
CopyCtrl+CCopies the selection of the active cel (or the whole cel). Also puts a PNG on the system clipboard.
Copy mergedCtrl+Shift+CCopies the rendered image of all visible layers as plain RGBA.
CutCtrl+XCopies and erases.
PasteCtrl+VPastes as a floating selection at the selection or centered. An image copied in another application is used when it differs from the last internal copy.
Paste as new layerCtrl+Shift+VPastes into a new layer.
Paste as new spriteCtrl+Alt+VOpens the clipboard as a new document.
Copy as text grid (for client chats)–Copies a compact palette-index text grid of the selection or cel as text.

On indexed sprites the clipboard keeps native palette indices, and on tilemap layers it keeps tile IDs and flips. See Indexed clipboard and Tile clipboard.

Flip and shift pixels

Edit menu itemKey
Flip Horizontal (selection/cel)Shift+H
Flip Vertical (selection/cel)Shift+V
Shift Left (wrap), Shift Right (wrap), Shift Up (wrap), Shift Down (wrap)Ctrl+Alt+arrow
Shift by N (wrap)… (dx, dy, Apply to)–

These act on the current cel, inside the selection rectangle if there is one. Shifting wraps pixels around the edges.

Whole-sprite transforms

These Sprite menu items change every frame and layer (and slices) in one undo step and clear the selection.

Sprite menu itemKeyFields and behavior
Sprite Size…Ctrl+Alt+IWidth (px), Height (px), Scale (%) (100), Lock ratio (on), Method: nearest (default), bilinear, rotsprite, scale2x, scale3x, epx. Scale2x/3x/EPX need integer ratios and otherwise fall back to nearest.
Canvas Size…Ctrl+Alt+CWidth, Height, Left, Top, Right, Bottom. Negative values remove pixels; pixels are not scaled.
Crop to Selection–Crops to the selection bounds.
Trim–Crops to the opaque pixels of all frames and non-reference layers.
Trim by Grid–Trims, then expands outward to whole tile-grid cells.
Rotate Canvas 180°, Rotate Canvas 90° CW, Rotate Canvas 90° CCW–Exact rotations.
Flip Canvas Horizontal, Flip Canvas Vertical–Mirrors the whole sprite.

Layers and groups

The Layers panel lists layers top to bottom. Its header has Blend and Opacity (0–255) for the active layer. Each row has an eye (visibility; Alt+click solos the layer), a lock, a chain for continuous, the name, and badges: REF (reference), BG (background), the blend mode when it is not normal, and the opacity when it is below 100%. A colored left border shows the layer's color tag. Double-click a name to rename it; drag rows to reorder; right-click a row for its menu.

The buttons below the list are + (new layer), +▤ (new group), ⧉ (duplicate), 🗑 (delete), ↑ and ↓ (move), ⤓ (merge down), ⚙ (properties) and ☰ (more).

Layer menu

ItemKeyWhat it does
New layerShift+NAdds a layer above the active one, in the same group.
New group–Puts the active layer into a new group.
New layer via copy / via cutCtrl+J / Ctrl+Shift+JMoves or copies the selection to a new layer.
Duplicate layer, Delete layer–
Layer properties…Shift+PName, Blend mode, Opacity (0–255), Visible, Locked, Reference layer, Continuous, Group, Color tag + Tag color, User data.
Rename layerF2
Toggle visibility, Solo layer, Toggle lock–
Toggle reference layer–Reference layers are visible while editing but never exported.
Toggle continuous–New frames link this layer's cels automatically.
Reference cel bounds…–See Reference images.
Move layer up, Move layer down–Moves within the parent group.
Merge downCtrl+EMerges into the layer below.
Flatten visible, Flatten–Merge visible layers, or all layers, into one. Flatten removes groups.
Convert to background, Convert to normal layer–A background layer stays at the bottom, is opaque and has no transparent index.
New Reference Layer from File…, New Layer from File…–See Import as layers.
New tilemap layer…, Convert layer to tilemap…, Convert tilemap to normal layer–See Tilemap layers.

Alt+↑ and Alt+↓ select the layer above or below. The row menu adds New group from layer, Remove from “group” and a Color tag list.

Blend modes

normal, multiply, screen, overlay, darken, lighten, color-dodge, color-burn, hard-light, soft-light, difference, exclusion, hue, saturation, color, luminosity, addition, subtract, divide.

Groups

  • Groups can nest and can be empty. Group rows have their own eye, lock, collapse caret (▸/▾) and member count. Drop a layer onto a group row to move it into the group.
  • The group menu: Rename group…, Duplicate group, Expand/Collapse, Show / hide group, Lock / unlock group, Merge group into one layer, Ungroup, Delete group and its layers.
  • Hiding or locking a group affects its children without changing their own flags. Collapsing hides its rows.
  • Sibling groups may share a name, have an empty name or contain slashes; each group keeps a stable identity that survives renames and .isbsprite saves.
  • Ungroup moves the immediate children up one level. Merge group into one layer bakes the group's composite once. Duplicating creates an independent copy and keeps links between frames inside the copy.
  • A group composites its children in isolation, and cel z-order is bounded by the group.
Limits. Groups have visibility and lock in the UI but no editable opacity or blend mode. Aseprite imports keep group flags, opacity, blend and metadata.

Timeline, frames, cels and tags

The timeline shows tags on top, then frame headers, then one row per layer (groups have collapsible rows). Each cell is a cel. Linked cels (one image shared by several frames) are drawn joined. Drag the top edge to resize the timeline.

Controls

  • ⏮ first, ◀ previous, ▶ play/stop, ▶| next, ⏭ last; a speed selector (0.25× to 3×); and the checkboxes once (stop at the end), all (ignore tags) and rewind (return to the start frame on stop, on by default).
  • Buttons for new frame, new empty frame, delete frames, frame properties, new tag, and ☰ for the frame menu.
  • Playback plays the tag under the playhead in its direction and repeat count, unless all is on.

Mouse

  • Frame header: click to go there, Shift+click to select a frame range, double-click for frame properties, drag to move frames.
  • Cel: click to select; Shift+click to select a cel range; drag a selected range to move cels, Ctrl+drag to copy, Alt+drag to link (links only within one layer). Right-click for the cel menu.
  • Tag: click to select its frames, double-click to edit, right-click for Tag properties…, Select tag frames, Play this tag, Direction: … and Delete tag.

Frame menu

ItemKeyWhat it does
New frame (copy)Alt+NInserts a copy of the current frame after it.
New empty frameAlt+Shift+NInserts an empty frame after the current one.
Duplicate linked cels–Inserts copies of the selected frames after them, with the cels of the selected layers linked to the originals.
Delete frame(s)Alt+CA sprite keeps at least one frame.
Reverse framesAlt+IReverses the selected frames.
Frame properties…Alt+PDuration in ms (1–65535), or Constant frame rate with FPS (constant) (0.1–120), for the selected frames.
Constant frame rate…–Frames per second (0.1–120) for every frame.
Cel properties…–Opacity (0–255) and Z-index (−64 to 64; positive draws in front of upper layers).
Link celsAlt+LLinks the selected cels of a layer (select 2 or more frames).
Unlink cels, Clear cels–
New tag from range…Alt+TCreates a tag over the selected frames.
Tag properties…, Delete tag–Act on the tag at the current frame.
Play / stop, Toggle play once, Toggle play all (ignore tags), Toggle rewind on stop–Playback options.
Create action from preset…, Walk cycle from layers–See Animation helpers.

Keys: Space play/stop, ← or , previous frame, → or . next frame, Home first, End last. (Arrow keys nudge instead while something is selected or the Move tool is active.)

Tag properties

Name, From frame, To frame (1-based), Direction (Forward, Reverse, Ping-pong, Ping-pong reverse), Repeat (0–999; 0 = ∞) and Color.

Animation helpers

The Animation panel generates and checks frame sets. Most buttons work on the active layer across all frames; generators open a new document.

ControlWhat it does
StabilizeAligns every frame on the feet (bottom center) relative to frame 1, to stop jitter.
Unify paletteReduces all frames to one shared palette of 24 colors.
Remove flickerReverts single-frame isolated pixel changes (the frames before and after agree).
Split sheet…Cuts the current image into frames of Frame width × Frame height in a new document.
Generate: type, frames (2–32, default 4), amp (1–8, default 1), GenerateBuilds a looping animation from the current frame: idle-bob, breathe, squash, float, shake, walk-bounce.
Timing presets: action, frame count (1–16, empty = preset), Create actionAppends copies of the current frame with preset durations and a tag named after the action.
Walk / puppet: side view / front view, Walk cycle from layersBuilds a 4-frame walk (contact/passing) from layers named by role: legs (legL, legR, leg, foot, boot…), arms, head (lags one frame), body and secondary parts (hair, cape, tail…, which follow the body). Tagged walk.
Split into puppet layersSplits the current frame into legL, legR, body and plume layers in a new document.
4-dir walk set…Builds walk_down, walk_up, walk_right and walk_left from one source frame per facing (−1 = none; left mirrors right).
Squash, Stretch, Anticipation, Impact shake, Hit flashInsert a 1-px squash or stretch, a held crouch, a 2-frame 1-px shake, or a 1-frame white flash next to the current frame.
Auto-slice sheetSplits an image into frames at transparent gaps, in equal feet-aligned cells, with one tag per row.
Align groundPuts every frame's feet on the deepest common ground line, centered.
Check framesReports the union bounding box, pivot, pixels within 2 px of the cell edge, varying ground lines, empty frames and semi-transparent pixels.
Crop to union cellCrops the document to the union of all frames plus 2 px.

Timing presets

Frame > Create action from preset… offers the same presets.

PresetFramesDurations (ms)Phases
idle4300 eachrest, inhale, hold, exhale
walk4120 eachcontact, passing, mirrored contact, mirrored passing
walk66110 eachcontact, down, passing, then mirrored
run680 eachcontact, down, push, flight, mirrored contact, mirrored flight
attack4125, 50, 100, 125windup, strike, impact hold, recover
jump6100, 50, 80, 175, 80, 100crouch, launch, rise, peak, fall, land
hurt270, 70hit, recoil
death5125 eachhit, stagger, fall, impact, rest

With a different frame count, durations are resampled from the preset. LPC sheet export is described in LPC sheets; APNG timing in Animated PNG.

Palettes and color

The Palette panel shows the palette used by the color tools and stored in the document. Palette edits are undoable. The starting palette is endesga-32.

Palette panel

  • Swatches: click sets the primary color, right-click the secondary color, Ctrl+click or Shift+click selects entries, double-click edits, drag reorders. Hover shows the index, hex value and role name.
  • The Load palette… selector lists the built-in Presets (pico-8, sweetie-16, endesga-32, gameboy, nes, resurrect-32, grayscale-4) and your Saved palettes.
  • Buttons: + add the foreground color, ✎ edit the selected entry, 🗑 delete selected entries, ⇅ sort, ◐ gradient between selected entries, ⇄ reverse, Ramp hue-shifted ramp generator, Used select colors used in the sprite.
  • A warning appears when the primary color is not in the palette, with an Add button. The footer shows the color count and the sprite's color mode.

Palette menu (☰)

ItemFields and behavior
Edit entry…Hex, Hue, Saturation %, Value %, Red, Green, Blue, Name / role, Recolor pixels. On RGB sprites, Recolor pixels replaces that color everywhere. On indexed sprites it recolors only pixels that use this entry, keeping duplicate entries independent.
Add foreground color, Delete selected, Select allDeleting warns when the removed colors are still used.
Ramp generator…Base color, Steps (2–16, 5), Hue shift ° (0–60, 14), Dark % (0–95, 40), Light % (0–100, 80), Put ramp: append to palette, after selected entry, replace selected entries or as new palette. Shadows shift toward blue, highlights toward yellow.
Gradient between selected…Interpolate (RGB or Hue (HSV)) and, for two separate entries, Colors between (1–64, 3).
Reverse, Sort…Act on the selection or the whole palette. Sort keys: hue, saturation, brightness, luminance, ascending or descending.
Palette from sprite…Max colors (1–256, 32), Replace palette.
Palette from reference image…Pick an image; Colors (N) (1–256, 16), Replace palette.
Select used colors, Select unused colors, Remove unused colorsCompare the palette with the sprite.
Map sprite to paletteMaps every pixel to its nearest palette color.
Import palette file….gpl, .hex, .pal, .act, .txt, or an image (.png, .gif, .jpg, .jpeg, .webp, .bmp) whose colors become the palette (up to 256).
Export palette file…Format: GIMP .gpl (keeps names), Lospec .hex, JASC .pal, Adobe .act, PNG image (1px per color).
Save to library…, Delete from library…Saved palettes are .gpl files that appear under Saved.
Color mode…See Color modes.

The same actions are available as Palette: … commands in the command palette, including Palette: Sort by hue and the other sort keys.

Color panel

  • FG and BG chips choose which color you edit. A saturation/value square and a hue strip, plus R, G, B (0–255), H (0–359), S%, V% and Hex fields. + palette adds the color.
  • Harmony: complementary, analogous (default), triadic, split-complementary, tetradic, monochromatic.
  • Tints · shades · tones: 7 steps each toward white, black and gray.
  • Click a swatch to use it, right-click to set the background, Shift+click to add it to the palette.

Color modes and indexed color

Converting color modes

Sprite > Color mode… (also Color mode: RGB, Color mode: Indexed…, Color mode: Grayscale…) converts every cel of every frame. Linked cels stay linked, off-canvas pixels and cel positions are kept, and the change is one undo step.

FieldShown forValues (default)
Color modeallRGB, Indexed, Grayscale
PaletteIndexedcurrent palette (N) or extract from sprite
Extract colorsIndexed, extract2–256 (32)
Gray levelsGrayscale2–256 (256)
DitheringIndexed, Grayscalenone, ordered (Bayer 2×2), ordered (Bayer 4×4), Floyd–Steinberg
Dither strengthIndexed, Grayscale0–100 (50)

Tile images and their metadata are converted together. When a frame palette produces a different converted tile, a tile variant is appended and only the affected placements are remapped.

Exact palette indices

An indexed sprite stores a palette index for every pixel, not just a color. The editor keeps those indices exact:

  • Clicking a swatch selects that exact entry. A stroke in that color records its index, so two palette entries with the same RGBA value stay distinct. The eraser writes the transparent index.
  • Editing a palette entry with Recolor pixels changes only pixels that use that entry. Pixels whose index is ambiguous are reported and left unchanged.
  • Frame-specific palettes (from Aseprite or APNG imports) are kept per frame. Linked cels share their pixels while each frame keeps its own palette.
  • Opening an indexed PNG (1, 2, 4 or 8 bits, any filter, interlaced or not) keeps duplicate and unused palette slots, per-entry transparency and the exact index of every pixel.
  • For typed index edits without the UI, use pixel_indexed_edit or Lua.
Limits. The batch CLI and the MCP exporters write indexed PNG with the chosen palette order, duplicate and unused slots, per-entry alpha and retained indices. The editor's Export As dialog writes a palette PNG when the image has 256 colors or fewer, but derives that palette from the rendered pixels, so the original palette order is not kept. For exact indexed PNG files, use the batch CLI or io_export. Indexed export re-encodes the PNG; original packing, filters and compression are not preserved.

Indexed clipboard

On indexed sprites, Copy, Cut, Paste, Paste as new layer, Paste as new sprite, moving, duplicating, flipping, quarter turns, nearest-neighbor resizing and RotSprite rotation all carry the index plane, not just colors.

  • Paste replaces the destination index for each copied pixel, except the transparent index. It never blends palette colors into a third color. The Transparent BG while moving option skips pixels matching the secondary color.
  • Pasting into another indexed cel requires matching palette slots (names may differ) and compatible transparent-index use; otherwise the paste is rejected without remapping. Paste as new sprite keeps the source palette. Copy merged always makes a plain RGBA clipboard.
  • Copying pixels that have no stored index works only when each color matches a single palette entry. Otherwise use Copy merged or convert the cel to indexed first.
  • A background layer has no transparent index, so cut, move and clear are rejected there until you convert it to a normal layer.
  • Pasting into an RGB or grayscale sprite uses ordinary RGBA; the status bar says so, and the clipboard keeps its indices for later indexed pastes.
  • An image copied from another application replaces the indexed clipboard data.
Limits. Each working plane is limited to 16 million pixels. RotSprite rotation needs an 8× working copy, so its input is limited to 262,144 pixels.

Color profiles

Color management uses the bundled Little CMS engine; no separate install is needed. PNG files keep their ICC, gamma and related color information when opened, and the stored channel values are not converted on import. When a sprite has an assigned ICC or gamma profile, the main canvas displays its colors through that profile.

Sprite > Color profile… has two fields:

FieldOptions
OperationPreview converted colors (default; shows frame 1 converted, without changing anything), Convert sprite colors (changes pixel values to the new profile), Assign profile without changing pixels (only changes how the stored values are interpreted).
ProfilesRGB, Display P3, Local ICC file (you pick an .icc or .icm file).
  • Conversion changes cel pixels, frame palettes, tilesets and off-canvas pixels, preserving alpha and indexed identity. It is one undo step. A converted grayscale sprite becomes RGB.
  • Conversion targets must be RGB ICC profiles. A grayscale ICC profile can only be assigned to a grayscale sprite.
  • On export, PNG files are tagged with the assigned ICC or gamma profile without converting stored values; JPEG, WebP, TIFF and AVIF embed the RGB ICC profile; GIF, SVG and CSS exports convert to sRGB first. WebP and AVIF need an RGB profile.
Limits. Profiles the engine cannot interpret (unsupported cICP encodings, custom cHRM primaries without ICC, arbitrary ICC LUT profiles) are kept byte for byte, but display conversion and export to other formats reject until you assign a supported profile. Profile operations are not available on high-precision sprites.

High precision (16-bit and HDR)

Opening a 16-bit PNG or APNG, or a supported OpenEXR file, creates a high-precision sprite. Its authoritative samples are stored separately from the 8-bit preview you see on screen:

  • Unsigned16: exact integers 0–65535 in the source encoding.
  • Float32: linear sRGB, finite RGB within ±65504 and alpha 0–1.

Undo, .isbsprite saves, linked cels, layer and cel opacity, visibility, z-order, groups and the blend modes normal, multiply, screen, addition, subtract, darken and lighten work on the exact values.

Precision dialog

Sprite > Precision — 16-bit / HDR… On an ordinary sprite it offers only Enable high precision (promotion cannot invent precision that was not in the source). On a precision sprite, Operation offers:

OperationUses fields
Set exact RGBA rectanglex, y, width, height (defaults to the selection), R/G/B/A (0–65535 or linear float)
Apply exposure to rectanglerectangle, Edit exposure stops (−24 to 24)
Display exposure / tone map onlyDisplay exposure (−24 to 24), Display mapping (Clip SDR preview or Reinhard HDR preview). Changes the preview only, never the samples.
Convert samples to linear float32–
Bake display to 8-bit (discard precision)–
Export PNG16 / float32 EXRExport local path (.png/.exr) and PNG16 encoding: Keep encoded source samples, sRGB, Linear sRGB, Rec2020 PQ (203 nit reference white), Rec2020 HLG (1000 nit display).

Storage chooses Unsigned16 encoded channels or Float32 linear-sRGB HDR when enabling. The operations act on the current frame and layer.

Formats

  • PNG/APNG import decodes every non-indexed 16-bit color type, all filters, Adam7 and transparent keys; APNG blending and disposal are composed on the 16-bit planes.
  • PNG16 export writes the current frame. It rejects values outside the chosen encoding instead of clamping. PNG cannot store float samples.
  • OpenEXR import accepts single-part, uncompressed scanline RGBA in HALF or FLOAT with linear sRGB/Rec.709 primaries and matching zero-origin windows. Export writes uncompressed FLOAT32 RGBA. EXR uses premultiplied alpha; the editor converts it.
Limits. Brushes, filters, palette conversion, geometry operations, color profiles, sheets, APNG export and most layer imports refuse precision sprites rather than silently reducing them. Use the dialog, or bake to 8-bit first. The canvas is an SDR preview, not a calibrated HDR output. A precision cel may have at most 4,194,304 pixels and a sprite 16,777,216 cel pixels in total. Indexed, tilemap, reference and off-canvas cels must be converted to plain raster before promotion. Compressed, tiled, deep or multipart EXR files, extra channels and other primaries are rejected, and general EXR metadata is not kept.

Reference images

  • File > Import as Reference Layer… or Layer > New Reference Layer from File… adds the first frame of an image or sprite as a reference layer at the bottom of the stack, named Reference: <file>, at 160/255 opacity. It is scaled to fit and centered on every frame.
  • Reference images keep their full source resolution and fractional placement. Select the reference layer and use the Move tool: drag to move, drag the bottom-right handle to resize (Shift keeps the aspect ratio). No resampling happens.
  • Layer > Reference cel bounds… sets X, Y, Width and Height exactly, in steps of 1/65536 pixel.
  • Any layer can become a reference with Toggle reference layer.
  • You cannot draw on a reference layer. Reference layers are shown while editing and picked by the eyedropper (Sample: composite), but they are left out of onion skin and of every image and sheet export.

Tilesets and tilemaps

There are two places to work with tiles. The Tiles mode is a standalone tileset and map workshop. Tilemap layers bring tiles into an ordinary sprite in the Editor, where you draw with the tile brush.

Tiles mode

The left panel builds the tileset, the center is the map, and the right panel shows the tileset palette. Tiles mode has its own undo (Ctrl+Z, Ctrl+Y, 100 steps). Its tileset and map are kept only while the app runs: export them, or store them in a sprite with Tileset → editor or Save into doc.

SectionControlWhat it does
TilesetTile W × H (default 16 × 16) and ApplySets the tile size. An imported sheet is re-split; otherwise the tileset and its autotile sets are emptied.
Import PNG…, From editorSplits an image (or the editor's current frame) into tiles in grid order. Trailing empty tiles are dropped.
+ SelectionAdds the editor selection (or a sprite exactly one tile in size) as a tile.
Delete tileDeletes the selected tile, empties the cells that used it, renumbers the rest and removes autotile sets that contain it.
Export PNG…, ClearSaves the tileset sheet; Clear empties the tileset, its sets and the map.
Autotile generatorSet: 16 (4-bit) or 47 (blob); keep palette; Generate from tileBuilds an autotile set named Terrain N from the selected tile and selects the Auto tool. keep palette maps the results back to the tile's own colors.
Base (Stone, Wood planks, Metal plate, Grass, Fabric weave, Brick) and + Recipe tileAdds a tileable texture-recipe tile, using the Textures panel colors when set.
Extract from level imageOffset X, Y; flips (on); Open level image…, From editorCuts an image into unique tiles plus a map. Identical tiles are stored once; with flips on, mirrored and (for square tiles) diagonally flipped copies are reused. Empty cells stay empty; partial edge tiles are ignored.
MapSize W × H (default 20 × 12), Resize, Clear map, Fill with tileResize keeps the top-left; Fill paints every cell with the selected tile and flips.
Export / editorExport .tmj…Writes a Tiled JSON map and <name>-tileset.png beside it.
CSV…, Map PNG…Tiled-style CSV (tile ids, −1 = empty, flips dropped) or the rendered map.
Import .tmj…Opens a Tiled JSON map (.tmj or .json) and its tileset image: the first tile layer and first tileset.
Map → editor, Tileset → editorOpen the rendered map, or the tileset sheet with the map stored in the document, as editor tabs.
Map → tilemap layerAdds the map as an editable tilemap layer (tileset, tile ids, flips and autotile sets) to the current editor sprite.
Save into doc, Load from docStore or load the map and autotile sets in the current editor sprite (it must be the tileset sheet). Switching to Tiles loads a sprite that holds tile data automatically.

Map tools: ✎ Paint (B), ⌫ Erase (E), ◩ Fill (G), ▦ Auto (A), ⌖ Pick (I); flips ⇋ X (X), ⇅ Y (Y) and ⤡ D (D, square tiles only); Auto set; grid; Fit (0). Left button paints, right button erases, middle button or Space pans, the wheel zooms (1–32×). In the tileset palette, click a tile to paint with it and double-click a tile of an autotile set to paint with that set; numbers shows tile indices.

How autotiles work

  • Each cell painted with the Auto brush remembers its terrain set, and its tile variant follows the neighbors of the same set. A 16-tile set looks at 4 edge neighbors; a 47-tile blob set looks at 8 neighbors, where a corner counts only if both adjacent edges connect. The map border and other sets count as “not connected”.
  • Generated variants get a bevel highlight on exposed top and left edges, a shadow on bottom and right edges, a darkened outline and cut corners; the 47 set also shades inner corners.

Tilemap layers

  • Layer > New tilemap layer…: Name, Tileset (New empty tileset, the Tiles mode tileset, or an existing one), Tile width and Tile height (1–256). An existing tileset's tile size wins.
  • Layer > Convert layer to tilemap…: tile size, Tileset (New tileset or existing), Reuse flipped tiles (X / Y / diagonal) (on). Every cel is cut into tiles; identical and flipped tiles are stored once.
  • Layer > Convert tilemap to normal layer keeps the rendered pixels and drops the tile data.
  • Tile 0 is always the empty tile. Workspace tile #n becomes layer tile n+1.

Tile brush and Tilemap panel

Select the tile brush (▦) from the toolbar or the Tilemap panel. The left button applies the current mode, the right button erases, Alt+click picks a cell's tile and flips. Painting outside the map grows it.

The Tilemap panel shows the layer, its tileset and the map size, a scrollable tileset strip (tile 0 is drawn as a slash and erases), and:

  • Modes: ✎ Tile (paint the selected tile), ⌫ (erase), ⌖ (pick), ▦ Auto (autotile brush).
  • Flips ⇋X, ⇅Y, ⤡D (diagonal only for square tiles).
  • Auto set selector, +16 and +47 to generate a 16-tile or 47-tile blob set from the selected tile (appended to the layer's tileset).
  • The pixel-edit mode, which decides what drawing pixels with any other tool on a tilemap layer does:
    • Manual: edit tile everywhere (default): editing a placed tile changes that tile in the tileset, so every placement updates. Pixels drawn on empty cells become new tiles or reuse a matching one.
    • Auto: reuse / remove unused tiles: the edited cell gets a matching existing tile or a new one, then unused tiles are deleted and IDs renumbered in every layer and frame that uses the tileset.
    • Stack: retain tiles, append edits: every edited cell gets a new tile; existing tiles never change.
  • grid and → normal layer. On a normal layer the panel offers + Tilemap layer and Convert layer → tilemap.

Tile clipboard

  • On a tilemap layer, Copy, Cut, Paste, moving and duplicating work on tile IDs and flips, not pixels. A selection includes every grid cell it touches; holes stay unselected. Copy without a selection takes the whole tilemap, including off-canvas cells.
  • Cut and Clear selection clear placements only; the tiles themselves do not change, even in Manual mode.
  • Paste snaps to the grid; drag or arrow keys move by whole cells. Selected empty cells erase the destination. Flips combine with existing flips; square tiles rotate in quarter turns and rectangular tiles in half turns.
  • Within the same tileset IDs are kept. Into another tileset, each source tile is matched to an identical destination tile or appended; existing tiles are never overwritten.
  • Paste as new layer creates a tilemap layer with the complete source tileset. Paste as new sprite keeps color mode, palette and tilemap.
  • Use Copy merged for pixel resizing or free rotation. The system clipboard receives a PNG preview; an image from another app replaces the tile data.
Limits. Cell paste needs matching tile size and grid alignment, matching color modes and, for indexed sprites, matching palettes and transparent index. Cross-tileset terrain needs a new tilemap layer. External tilesets must be embedded first. The tile clipboard holds at most 1,048,576 cells and 16,777,216 pixels.

External tilesets

An Aseprite file whose tileset lives in another file resolves that file when it is a relative path inside the project folder (.aseprite, .ase, .isbsprite, .gbsprite or .pforge, tile size must match), and embeds the tiles so the saved .isbsprite is self-contained. Absolute, network and parent-folder paths are refused; nesting is limited to 8 levels and cycles fail. Missing tilesets keep their IDs and produce an import warning.

Tile formats

FormatDirectionNotes
Tileset sheet .pngimport, exportTiles mode.
Tiled JSON .tmj + tileset PNGimport, exportOrthogonal, finite, one tile layer and one embedded image tileset; flip flags in the standard high bits. Autotile sets are not written. An external .tsx tileset reference is not loaded.
CSVexportTile ids, −1 = empty.
Map PNGexportRendered map.
.isbspriteopen, saveKeeps tilemap layers, tilesets, autotile sets and tile metadata.
.aseprite/.aseimport onlyTilemap layers, tilesets, flips and tile metadata are read.
.isbtileclipMCP onlyTile clipboard files written by pixel_tile_copy.

The batch CLI can put tilesets in a sprite sheet with --export-tileset. TMX/TSX map files are not handled by this editor; see Formats & interchange.

Slices and 9-slice

A slice is a named rectangle with an optional 9-slice center, an optional pivot, a color and user data. Bounds, center and pivot are stored as per-frame keys: a key applies from its frame until the next key, and an empty key hides the slice. Slices are saved in .isbsprite files and read from Aseprite files.

Slice tool

The slice tool (⧈, Shift+C): drag on empty canvas to create a slice, drag inside a slice to move it, drag its bottom-right handle to resize it. Moving or resizing edits the key at the current frame (or creates one).

Slices panel

  • The list shows each slice with badges: 9 (9-slice), ⊕ (pivot) and ◆N (N keys).
  • The editor fields act at the current frame: Name and color, x y w h, 9-sl (the center rectangle, relative to the slice), pivot (relative to the slice; defaults to bottom center) and User data.
  • Keys: one button per key (click to go to that frame), +key (copy the key in effect to the current frame), hide (hide from this frame), −key (delete this frame's key).
  • ✎ Draw selects the slice tool, + Selection makes a slice from the selection, + New… asks for Name, X, Y, Width, Height, 9-slice center and Pivot (bottom center). Duplicate and Delete.
  • 9-slice preview…, Export slices… and show (draw slices on the canvas).

Menus: Select > New slice from selection, View > Show slices, Sprite > Preview 9-slice at size…, File > Export slices….

9-slice preview

Preview 9-slice at size… asks for Width, Height and Edges / center (stretch or tile), then shows the slice scaled to that size. Open as sprite opens the result as a new document. A slice without a center is scaled as a whole.

For slice export, see Export slices.

Sprite metadata

User data

Plain-text user data can be edited on the sprite (Sprite > Properties…), on layers (Layer properties…) and on slices (Slices panel). Sprites built from PXL code store their ramps in the sprite's user data; clearing it removes those ramps from the PXL filters.

Typed properties

Sprites, groups, layers, cels, tags, slices, tilesets and individual tiles can also carry typed properties in Aseprite's native property model, either as user properties or in named extension namespaces. Aseprite imports keep them, and .isbsprite saves them losslessly.

TypesRules
bool, int8, uint8, int16, uint16, int32, uint32Exact integers in range.
int64, uint64Exact; stored as decimal strings.
fixedSigned 16.16, exact multiples of 1/65536.
float, doubleFinite numbers or the strings NaN, Infinity, -Infinity, -0.
stringUp to 65,535 UTF-8 bytes.
point, size, rectint32 fields.
vector, mapNested up to 128 levels; at most 1,000,000 entries and 64 MiB in total.
uuid32 hex digits, or the hyphenated form.

There is no typed-property editor in the UI. Edit them through Lua (sprite.properties.category = 'player', sprite.properties('org.example.game').speed = 12; see Properties) or the MCP tools pixel_properties_info and pixel_properties_edit. A plain value written from Lua keeps the property's existing type when it fits; otherwise booleans become bool, integers int32 (or uint32), other numbers double, arrays vectors and tables maps. Unknown or malformed property maps are kept unchanged.

Repair workspaces

Grid repair, Pixelizer, Ripper and Video convert an outside image into clean pixel art. Every one is deterministic: the same input and settings give the same result. Each re-runs live when you change a setting. Send to Editor opens the result as a new single-layer document tab, and Export PNG saves it directly.

Repair workflow

  1. In Grid repair, load the enlarged or blurry art and let it find the true pixel grid. Strip a fake checkerboard first if one is baked in. Then Send to Editor, or use Export report… to get a reusable recipe.
  2. In the Editor, run Sprite > Auto-repair anatomy… and read the open items it reports.
  3. Fix the remaining parts by hand: stamp clean hands, feet, eyes and mouths from Body parts (anatomy fix), draw limbs, mirror halves.
  4. Clean up with Fix & clean (orphans, outline, pixel-perfect, Clean all).
  5. Open Analyze and click Analyze + critique; fix every listed item until the verdict is SHIP.
  6. Run the same recipe over a folder in Batch.

For agents, pixel_guide returns the same workflow with anatomy and animation rules.

Grid repair

Load image… accepts PNG, APNG, JPEG, WebP, GIF, BMP, TIFF and AVIF. The grid is detected on load and the found size and offsets are written into the fields; edit them to override.

ControlDefaultWhat it does
Pixel size (0 = auto)0Size of one enlarged pixel. 0 detects it.
Offset X, Offset Y0Grid origin, used when Pixel size is set.
Grid fiteach line (best)How grid lines are placed: each line (best) fits every line to the real edges (handles uneven, drifting pixels), greedy edge walk, or uniform spacing.
Line snap range0.3 (0.05–0.5)How far, as a fraction of a cell, a line may move from the uniform grid.
Cell samplingmode (robust)How each cell becomes one color: mode (robust), majority (2-means) (keeps colors from the source), median, center, average. A cell more than half transparent becomes transparent.
Max colors24 (0–256)Palette limit; 0 keeps all colors.
Merge shades ΔE5 (0–40)Merges near-identical shades into the more common one; 0 = off.
Remove backgroundoffRemoves the most common border color by flood fill.
Remove orphan pixelsonReplaces lonely pixels with the dominant neighbor color; high-contrast pixels (eye shines, sparkles) are kept.
Repair outlineoffTurns every edge pixel into the detected outline color and removes doubled corners.
Re-detect grid, show gridshow onDetect again; draw the fitted grid in magenta on the source preview.

The report shows the detected size, confidence, offsets, how irregular the fitted grid is, and every step. If the size is wrong, type the pixel size and offsets yourself and watch the magenta grid line up.

The Extra cleanup (pixelpipe) block adds:

OptionDefaultWhat it does
Strip fake checkerboardoffRemoves a fake transparency checkerboard connected to the border before detection.
Exact scale firstonIf the image is an exact integer upscale, uses that scale. While an exact upscale is found, it overrides typed sizes and offsets.
Harden alpha stepsoff, 0 255Snaps alpha to the listed steps (for example 0 64 160 255).
Despeckle clusters < N pxoff, 3Removes opaque blobs smaller than N pixels.
Dedupe colors, toloff, 8Merges colors within the tolerance onto the most used one.
DehalooffReplaces a grayish matte fringe on edges with neighbor colors.
Export report…–Writes clean.png, an enlarged [email protected], before_after.png, palette.png, report.json and recipe.json to a folder.
Limits. The Palette selectors in Grid repair, Pixelizer and Video offer only the automatic option. A Grid repair recipe.json replayed in the Batch workspace honors scale, colors, merge, background, orphan, outline and palette settings, but not the grid-fit, sampling and offset settings; the MCP tool fx_apply_recipe replays all of them.

Pixelizer

Turns photos, renders and illustrations into pixel art. Load image…, then:

ControlDefaultWhat it does
Width (px)96 (4–1024; set on load)Output width; height keeps the aspect ratio.
Downsamplemode (crisp)mode (crisp), average (smooth), median, nearest.
Colors16 (2–256)Palette size.
Dither, Dither strengthnone, 0.5none, bayer2, bayer4, floyd.
Contrast, Saturation, Brightness0 (−100 to 100)Adjustments applied before downsampling.
OutlineoffAdds a 1-px outer outline in the detected outline color.
Remove background firstoffRemoves the border background before pixelizing.

Texture Ripper

Load photo…, then click the four corners of a surface seen in perspective (top-left, top-right, bottom-right, bottom-left); drag points to adjust. The quad is unwarped into a flat texture.

  • Output width, Output height: 128 (4–2048).
  • Make seamless (tileable): cross-fades each edge with the opposite edge (this adds blended colors).
  • Pixelize to width (0 = off, up to 512) with Colors (16).
  • Reset points; preview tiled shows the result 2×2.

Video

Load video… (MP4, WebM, MOV, MKV) samples frames, pixelizes them with one shared palette so colors do not flicker, and sends them to the timeline.

  • Start (s) (0), End (s) (set to the first 3 seconds on load), Sample FPS (8, 1–30), Width (px) (96, 8–512), Colors (16), Dither (none, bayer2, bayer4), Remove background (off), Remove flicker (on).
  • Extract frames samples at most 120 frames. Send to Editor opens them as one layer with frames of 1000/FPS ms. Export GIF writes a 3× enlarged GIF.
Note. The Video open dialog also lists GIF, but frames are decoded by the built-in video player, which may not read GIF files. To edit an animated GIF, open it with File > Open…; each GIF frame becomes a timeline frame.

Fix & clean, anatomy and critique

Apply to

Fix & clean, the Filters and palette-swap variants share one target list: Current cel, All frames of layer, All layers (this frame), All layers & frames and, when the timeline has a range, Timeline range. Locked layers are skipped and linked cels are processed once. Fixes apply to the selection rectangle when there is one.

Fix & clean panel

ButtonWhat it does
OrphansRemoves single-pixel noise.
Repair outlineEvery edge pixel becomes outline color; doubles are removed.
Pixel-perfectRemoves L-corners in 1-px outlines.
Add outlineAdds a 1-px outline in the primary color.
Remove BGFlood-removes the background from the edges.
Merge shadesMerges near-identical shades.
Smooth noiseMajority filter.
Hard alphaNo semi-transparent pixels (alpha ≥ 128 becomes opaque).
Mirror L→R, Mirror R→LCopies one half onto the other.
Rotate N ° + RotSpriteClean pixel-art rotation (default 15°, step 5).
Strip checker, Dehalo, Despeckle <N, Dedupe colors, Harden steps, SeloutThe pixelpipe cleanups, using Despeckle N (3), Dedupe tol (8), Alpha steps (0 255). Selout gives lit edges the mid shade of their ramp.
Detect scale, Downscale ÷NDetect an exact integer upscale (or estimate one) and shrink the whole sprite by it.
Clean allHarden alpha → despeckle → dedupe → dehalo → palette lock or color limit, using Max colors (32; 0 = off) or Lock to palette.

Body parts

The Body parts (anatomy fix) panel builds clean parts procedurally, with exact finger counts and a 1-px outline lit from the top-left.

PartParameters (default, range)
hand opensize (12, 6–40), fingers (5, 3–5; total digits including the thumb, 4 = cartoon glove), thumb left/right
fistsize (10, 6–32), fingers (4, 3–4), thumb left/right, cuff no/yes
footsize (12, 5–40), style shoe/boot/bare, facing right/left
eyesize (6, 3–20), look center/left/right/up/down, style round/dot
mouthwidth (8, 3–30), style open/smile/frown/flat/o
headwidth, height (16, 4–64)
  • Colors: Colors: from selection (select the old part first to match its colors), Colors: from whole sprite or Colors: from primary color. flip mirrors the part.
  • Use stamp tool selects the Stamp tool (◈, P): click to place the part. With horizontal symmetry on, both sides are placed.
  • Draw limb selects the Limb tool: drag from joint to joint. thick (3, 1–16) sets the limb width.
  • Copy as spec part and Insert into spec hand the part to the Spec workspace.

Auto-repair anatomy

Sprite > Auto-repair anatomy… detects hands, feet and eyes and repairs them on the current layer. Each step has a checkbox (all on by default):

  • Snap upscaled art to its pixel grid (only when a grid is detected; the result then opens as a new document).
  • Isolate the subject: drop background debris and background-only colors.
  • Paired parts: mirror the better hand, foot or eye onto the worse one (for symmetric sprites).
  • Remove noise inside detected parts.
  • Repair the outline locally around detected parts.
  • Rebuild hopeless hands procedurally (automatic only for confident, paired, very noisy parts).

Options: rebuild all hands as fist or open hand, force pair mirroring, and Apply to (current cel or all frames of the layer). The live preview shows before (detected parts) and after, and the report lists each fix and each open item. Anything the tool is unsure about is left unchanged and reported as an open item; fix those by hand. Apply is one undo step.

Analyze and critique

The Analyze panel (or Sprite > Analyze) inspects the current frame. Choose as (auto, item, prop, character, boss, block, tile, scene, freeform) and click Analyze + critique.

  • The verdict is ✓ SHIP when no major check fails and fewer than 3 minor checks fail; otherwise ✗ FIX, with a numbered fix list and coordinates where possible.
  • Checks include: not empty, palette budget for the type, near-duplicate colors, hard alpha, isolated pixels, filler noise, edge padding, readable silhouette, outline consistency, near-symmetry, paired features level and equal, jaggies, pillow shading, banding, anti-aliasing at small sizes and 1-px anatomy. Blocks and tiles must fill every pixel and tile seamlessly.
  • The report also shows size, color count, outline color, grid size and confidence, symmetry and ramps. Silhouette view shows a flat silhouette.
  • Copy grid for client copies a compact palette-index text grid (sprites up to 128×128; at most 36 colors). Auto-repair… opens the repair dialog.

Style library

The Style library panel studies a reference to learn its rendering rules, never its content. Study current sprite or Study image… reports true size, colors, value range, dither share, outline share and ramps, then saves a style card under a name. Each card has Apply palette, Notes (do/don't rules such as palette size, outline style and dithering), Copy notes and ✕. Learned palettes lists the card palettes. Cards are shared with the MCP style_* tools.

Filters and textures

Filter dialogs

Each filter opens a dialog with its parameters, Apply to (see targets), Selection only (on when a selection exists; only selected pixels change) and Live preview (current frame only). OK applies to every targeted cel as one undo step. The last values are remembered per filter.

Filters menu itemKeyParameters (default)
Replace color…–From (primary), To (secondary), Tolerance (0–255, 0)
Invert…Ctrl+IInvert alpha too (off)
Brightness / contrast…–Brightness, Contrast (−100 to 100, 0)
Hue / saturation…Ctrl+UMode (hsl/hsv), Multiplicative, Hue (−180 to 180), Saturation, Lightness / value, Alpha (−100 to 100)
Color curve…–Curve editor with Channel (RGB, R, G, B, A) and Reset; click adds a point, drag moves, right-click removes
Posterize / limit colors…–Levels per channel (0 = off) (4, 0–32), Max colors (0 = off) (0–256), Dither (none, bayer2, bayer4, floyd)
Gradient map…–Ramp dark→light, Stretch luminance (on), Sort ramp by luminance (off)
Convolution matrix…–Preset (blur, gaussian, gaussian-5x5, box-blur-5x5, sharpen, sharpen-strong, edge, edge-laplacian, emboss, sobel-x, sobel-y, custom), Matrix (custom), Divisor (0 = auto), Bias, Convolve alpha, Wrap edges, Snap to (none, image, palette)
Despeckle (median)…–Width, Height (3, 1–15, odd)
Outline…–Color (primary), Place (outside/inside), Matrix (circle, square, horizontal, vertical)
Selective outline (selout)…–Light from (8 directions, top-left), Shadow-side color (empty = darkest of ramp), Matrix (circle/square)
Shifted-shape cel shading…–Mode (shape/regions), Ramp dark→light (empty = from base), Base color (empty = most used), Shades (4, 2–8), Light step dx/dy (−1, −4 to 4), Outline (keep/none)

Ramp fields accept a hex list and have Palette and From FG buttons. Color fields have FG and BG buttons.

Palette-swap variants

Filters > Palette-swap variants… groups the sprite's colors into hue ramps and makes recolored variants that keep the shading. Source of new colors: hue (rotate hues) or palette (map ramps onto ramps from the current palette); Variants (6, 1–24); Hue step (°, 0 = even); Keep grays / outline (on). Click a thumbnail to preview it on the canvas. Apply recolors the sprite; Export variants… writes variant_01.png…, variants_sheet.png and variants.json to a folder.

PXL lighting filters

These apply to the current cel (or all frames when All frames is checked) and to the selection when there is one.

  • Lighting (PXL)…: Lamps as x,y,r,#color,power,z; …, Ambient 0..1 (0.2), Sky light 0..1 (0), Sky color, Cell px (1), Smooth cells, Opaque pixels block light, Relief (none, dome, bevel, luma).
  • Normal map from sprite (PXL)…: Shape (dome, bevel, luma), Depth (1), Bevel width (2). Opens the normal map (green up, flat #8080ff) as a new document. File > Export normal map (_n.png)… writes it directly.
  • Glow (PXL)…: Glow colors (hex, comma), Radius px (6), Strength (0.5), Mode (color screens a glow color; ramp stays in the palette), Ramp steps (ramp mode) (2), Bands (0 = smooth).
  • Shade / Light region (PXL ramps)…: Mode (shade/light), Ramp steps (1), Density 0..1 (1; below 1 uses Bayer dither).

Ramp-based filters use the PXL ramps stored in the sprite, then the palette's ramps, then ramps extracted from the frame.

Textures panel

The Textures panel fills the selection (or the cel) with generated texture. Fill chooses the kind; the other rows appear as needed.

FillSettings
Texture recipe (default)Recipe (Stone, Wood planks, Metal plate, Grass, Fabric weave, Brick), Tile size (16, 4–256), Seed. Recipes are tileable.
Noise, Noise circleSeed, Scale
VoronoiSeed, Cells (8), Border color
Dither (2 colors)Mix (0.5), Pattern (Bayer 2×2, Bayer 4×4, Bayer 8×8, Noise)
Gradient ditherShape (Linear/Radial, vertical/horizontal/diagonal), Pattern
Scatter partsParts, Count (12), Seed, Random flip; without captured parts it scatters built-in tufts
Pattern (part), Tile group (parts)Parts (and Seed, Random flip for tile groups)
  • Colors takes a hex list dark to light (transparent erases, keep leaves pixels); FG+BG, Ramp ▸ (next palette ramp) and Default fill it. + part captures the selection as a part. Paint on: anywhere, opaque pixels, empty pixels or FG color.
  • Apply fills the selection or cel; New sprite creates a new sprite with the texture.
  • Seamless check (also View > Seamless check (shift by half)) shifts the frame by half with wrap so the borders meet in the middle; toggle it off after fixing seams. Make tileable (also Filters > Make tileable (dithered seams)) cross-fades the borders with ordered dither, adding no new colors. View > Seamless score… reports the seam ratio.
  • Filters > Texture recipe… applies a recipe with Recipe, Tile size, Seed and Ramp (recipe default, Textures panel colors, from FG color). The Edit menu has Fill with noise (Textures), Fill with Voronoi (Textures), Dither fill (Textures), Gradient dither fill (Textures) and Scatter parts (Textures).
Limits. Filters, Fix & clean and variants refuse high-precision sprites; use the Precision dialog or convert to 8-bit.

Art as code: Spec

A sprite spec is a JSON text (with // and /* */ comments allowed) that describes a sprite as shapes grouped into parts and layers, color ramps, and poses. Each part is rasterized, shaded from the light direction, outlined and colored with its ramp. Frames are pose overrides of the same parts, so animation is a clean redraw rather than resampled pixels. Specs save as <name>.pfspec.json.

Spec mode

  • The template selector holds Examples (ninja, slime) and Character templates: Chibi (head 40–50%), Heroic (head 1/3–1/4), Tall tactical 48–64px (head 18–24%), Realistic (1/6–1/8 heads). Facing: front, three-quarter, side, back. New from template loads or generates it.
  • Template options: hair (short, long, spiky, bald), hands (fist, glove, hand), feet (boot, shoe, bare), height in px (16–128; empty = preset default), and six colors: skin, hair, outfit, pants, accent, boots.
  • Load spec…, Save spec… (keeps comments), Format (reformats; drops comments), Send to editor (opens the rendered sprite as a new document) and 4-dir walk set (renders the selected template in three facings into a document with idle_* and walk_* tags for down, left, right and up; left is the mirrored side view).
  • The editor re-renders 250 ms after you stop typing. The status line shows size, frames, layers, tags and pivot, or the errors with line and column; click an error to jump to it.
  • The preview has play/pause, a tag selector, zoom (zoom: fit, 4x–12x), onion, and a frame strip.

Spec format

KeyMeaning
sizeRequired [w, h], each 1–1024.
name, metaFile name; informational notes.
margin, fit, padScratch margin (16); auto (grow to include overhang), canvas (clip) or union (tight box of all frames plus pad).
pivot[x, y], default bottom center.
light, outlinetop-left (default), top-right or none; outline color for auto ramps.
ramps (alias palette)Named ramps: a base color ("#3f6fb5", auto shadow and highlight), an array dark to light, or an object of tone letters.
paramsDefault numeric parameters used by pose expressions.
layersRequired, back to front: name, opacity, blend, visible, pivot and parts.
framesduration (100), tag, params, pose.
actionsGenerated frame runs: tag, frames, duration or durations, keys (per-frame or keyframed parameter values) and pose.
tagsExplicit tags: name, from, to, direction.
  • Tone letters: o outline, d shadow, b base, l highlight, w white, k dark/pupil, s secondary, S secondary shadow.
  • Part fields: name, ramp or color, z, clip (keep only pixels inside another part), light, outline, flat, pivot, and one shape inline or shapes: [...].
  • Shapes: rect, ellipse (x, y, w, h); circle (cx, cy, r); capsule (x0, y0, x1, y1, r, or a points chain); polygon, triangle (points); pixels and ascii (rows of characters: . empty, a tone letter, - erase); part (procedural hand_open, fist, foot, eye, mouth, head). Any shape can take tone or erase: true.
  • Poses target a part, a layer or * (the whole sprite) with dx, dy, rotate, scale, flip, pivot, hide or any shape parameter. Values may be expressions over params such as "-bob*2" (numbers, names, + - * / ( )).
  • The rendered document gets the spec's layers, frames with durations, tags, a slice named pivot and a 16×16 grid.
{
  "name": "slime", "size": [32, 32], "margin": 12, "pivot": [16, 29], "outline": "#1a1020",
  "ramps": { "goo": ["#1a1020", "#2e7d5b", "#4fbf6f", "#a6f08a"], "eye": { "w": "#f4f0e8", "k": "#1a1020" } },
  "params": { "sx": 1, "sy": 1, "lift": 0 },
  "layers": [ { "name": "body", "parts": [
    { "name": "goo", "ramp": "goo", "shapes": [
      { "shape": "ellipse", "x": 6, "y": 12, "w": 20, "h": 20 },
      { "shape": "rect", "x": 0, "y": 29, "w": 32, "h": 8, "erase": true } ] },
    { "name": "eyes", "ramp": "eye", "outline": false, "clip": "goo", "shapes": [
      { "shape": "rect", "x": 12, "y": 19, "w": 2, "h": 3, "tone": "k" },
      { "shape": "rect", "x": 18, "y": 19, "w": 2, "h": 3, "tone": "k" } ] } ] } ],
  "actions": [ { "tag": "bounce", "frames": 6, "durations": [100, 60, 80, 160, 80, 120],
    "keys": { "sx": [1.25, 0.9, 0.85, 1.0, 0.9, 1.2], "sy": [0.75, 1.15, 1.2, 1.0, 1.1, 0.8], "lift": [0, -4, -9, -11, -6, 0] },
    "pose": { "body": { "scale": ["sx", "sy"], "pivot": [16, 29], "dy": "lift" } } } ]
}

MCP: spec_render and spec_template.

Art as code: PXL

PXL is a small JavaScript-based language for pixel art, written in *.px.js files. It is evaluated locally and deterministically (seeded random, no network). One file can define many sprites, animations, scenes and sheets.

Code mode

  • Code column: Open… (the file is watched and re-renders when it changes on disk), Save (Ctrl+S), Build (Ctrl+Enter), auto (rebuild 400 ms after typing), and Templates… (basics, forge, lighting, normals, shop, tackle, moon_bakery, moon_bakery_flat, moon_bakery_3d, neon_noodle_3d, outpost, cave, grotto, no_magic). Loading a template keeps your previous code; Code: Restore code replaced by a template brings it back.
  • Errors read file:line:col: asset > layer > op: message; click one to jump to it. One broken asset does not stop the others.
  • Assets column: each built asset with its kind (sprite, anim, scene, sheet). Send to editor opens the selected asset as a document with layers, frames, tags, palette and ramps. Export assets… writes every output to a folder.
  • Preview column: zoom with the wheel (Fit), hover to inspect a pixel's palette key, and replay the build step by step (⏮ ◀ ▶ ▶| ⏭, a step slider and list). Checkboxes grid, changes, animate and follow edits. Click a palette chip to use the color.
  • File > Open… on a .px.js file loads it in Code mode. Commands: Code: Build PXL (Ctrl+Shift+B), Code: Open .px.js…, Code: Send asset to editor.
pal({ k: "#1b1630", g: "#8ccf63", G: "#4c8a44", t: "#2a5560", w: "#fff6e0", r: "#e2585e", R: "#a63a4c" })
ramps("ktGg", "kRr")                   // dark -> light, drives shade()/light()

// Symmetric: write the left half, mirror it, outline it.
sprite("slime", { mx: true, outline: "k" }, `
  ....ggg
  ..ggGGg
  .ggGwGg
  gggkwgg
  gggkkgg
  tgggggg
  .tttttt`)
sprite("slime_red", { base: "slime", swap: { g: "r", G: "R" } })   // variant: 1 line

anim("bob", { base: "slime", fps: 6 }, frame(), frame(grid(4, 3, "kk")), frame({ hold: 2 }))

Language reference

GroupStatements and ops
Paletteuse("pico8" | "sweetie16" | "db16" | "endesga32" | "gray8") or use([hex…]) (default pico8, index keys 0-9a-zA-Z); pal({ key: "#hex" | index | "otherKey" }) with one-character keys; ramps("kDdu", …) dark to light.
ColorsA palette key, "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"; "." leaves a pixel, "_" erases it.
Assetssprite(name, opts?, ...items), anim(name, opts?, ...items), scene(name, { w, h, bg? }, ...items). Names starting with _ are parts (not exported).
Asset optionsw, h, mx/my (mirror; "c" shares the center column), swap, flip, rot, outline, outline8, crop, layers; sprites add base; scenes bg; anims base, fps (8), frames, loop. Applied in the order mirror, swap, flip, rot, outline, crop.
StructureGrid strings (template literals), frame({ ms | hold }?, ...items), layer(name, opts?, ...items) (x y hidden shade light density solid wall unlit), group(name, [members]), sheet(name, [entries], { cols, pad }), include("other.px.js"), functions (c) => {…} that receive the canvas, and helpers rng, wobble, sway, lissajous, TAU.
Shapespx, rect, box, line, hline, vline, ellipse, circ, ring, poly, fill
Tonedither, grad, noise, recolor, shade, light
Placementstamp, tile, pattern, tilemap, scatter, wire; options seed, reseed, frame, delay, rdelay, swap, rswap, flip, rflip, rot. Placing an animated asset animates its parent.
Othergrid(x, y, str), text(x, y, str, c, opts?) (built-in 3×5 font), clip(where, ...items)
Lightlamp, bump, normals, lighting, glow (lighting and glow go directly in a sprite or scene, after what they affect)
Helpersbox3 (oblique 3/4 box), stain, grime, flake, stonework

Regions (where, clip) are [cx, cy, r] circles, [x, y, w, h] rectangles, longer coordinate lists (polygons) or (x, y) => bool functions.

Outputs

Export assets…, the CLI build command and pxl_build write sprites/<name>.png (plus _n.png normal maps), scenes/, anims/<name>.png strips with .json and .gif, sheets with TexturePacker-style JSON, and enlarged previews in _preview/. With layers: true each layer is also written separately. A document sent to the editor carries its ramps in the sprite's user data, which the PXL filters use.

PXL command line

From the portable folder, with ELECTRON_RUN_AS_NODE set as described in Running the batch CLI:

& '.\Isberg Labs.exe' '.\resources\app\cli\pxl.js' build '.\Projects\art.px.js' --out '.\Projects\out'
& '.\Isberg Labs.exe' '.\resources\app\cli\pxl.js' ascii '.\Projects\art.px.js' slime
& '.\Isberg Labs.exe' '.\resources\app\cli\pxl.js' list '.\Projects\art.px.js'
  • build <art.px.js> [--out DIR] [--only a,b] [--scale N] [--no-preview]: writes all outputs (default folder <art file dir>\out).
  • ascii <art.px.js> <name>: prints an asset's palette keys with rulers (every frame for animations).
  • list <art.px.js>: lists assets, groups and sheets with file and line.
  • Exit codes: 0 success, 1 build errors, 2 usage error.

Opening and importing

Formats you can open

Use File > Open…, File > Import File (any format)… or drag and drop.

FormatOpens asNotes
.isbsprite (also .gbsprite, .pforge)Editable documentThe native format; everything is kept.
.aseprite, .aseEditable document (import only)8-bit (indexed), 16-bit (grayscale) and 32-bit (RGBA) files. Layers and groups with flags, opacity, blend and user data; linked cels; cel opacity and z-index; tags; slices with keys; palettes; grid; tilemap layers and tilesets; typed properties. External tilesets are resolved from local files. Cannot be saved back.
.pngIndexed, RGBA, grayscale or 16-bit documentIndexed PNG keeps exact palette and indices. 16-bit PNG opens as a high-precision sprite. Color and ancillary metadata (ICC, gamma, cICP, text, physical size, EXIF, …) are kept in the project. A PNG with animation chunks opens as APNG.
.apngAnimationEvery color type and bit depth, Adam7, all blend and disposal modes, loop count and exact frame timing. Indexed APNG keeps native indices; an excluded default image is kept in the project. 16-bit APNG opens as a precision sprite.
.gif, .webpAnimation or stillAnimated files become frames with their durations (minimum 10 ms).
.jpg, .jpeg, .tif, .tiff, .avifStill image
.exrFloat32 precision spriteSingle-part, uncompressed scanline OpenEXR only.
.px.jsCode modePXL source; other .js files are refused.
Limits. PNG and APNG input is limited to 128 MiB, 65535 pixels per side, 16,777,216 displayed pixels, 1,000 frames and 16 MiB of metadata; malformed files fail instead of falling back to the first image. BMP appears in some file filters but could not be confirmed to decode; convert BMP files to PNG first.

Import Sprite Sheet

File > Import Sprite Sheet… cuts a sheet into frames. Choose a source with Browse… (image or Aseprite file; its first frame) or Current sprite.

FieldDefault
Type: By rows, By columns, Horizontal strip, Vertical stripBy rows
X, Y0
Width, Height (cell size)32
Horizontal padding, Vertical padding (gap between cells)0
Include partial tilesoff
Skip empty cellson
Frame duration (ms)100 (min 10)

The preview outlines the cells. Import opens a new single-layer RGB document; palette and indexed identity are not kept on this path (opening an indexed PNG directly keeps them).

Image sequences

  • File > Import Image Sequence (files)… or (folder)… (the folder's images only, not subfolders). Files are sorted naturally (frame2 before frame10).
  • Then set Frame duration (ms) (100) and Align (top-left, center, bottom). Mixed sizes are placed on a canvas of the largest width and height. Animated inputs contribute all their frames.
  • A sequence of single-layer indexed PNGs stays indexed when the files share a transparent index and color profile; bottom alignment is not allowed for it.

Import as layers

  • File > Import as New Layer… (or Layer > New Layer from File…) adds a layer above the current one, named after the file. Larger images shrink to fit; a single frame becomes one linked cel in every frame; an animation maps frame by frame.
  • File > Import as Reference Layer… (or Layer > New Reference Layer from File…): see Reference images.
  • Sheet, sequence-to-layer and layer imports refuse 16-bit and HDR sources; open those as documents.

Exporting

Exports write standard image files and never change the document. Reference layers are never exported. Reference formats (.ase, .aseprite, .pforge) are import-only.

File menu

ItemKeyOpens
Export As…Ctrl+Alt+Shift+SThe Export As dialog.
Export Sprite Sheet…Ctrl+Alt+EThe sheet dialog.
Repeat Last ExportCtrl+Shift+XRe-runs the last export with the same path and options, without a dialog. The setting is global: repeating from another tab overwrites the same path.
Export PNG…, Export Animated GIF…, Export Animated PNG…, Export Animated WebP…, Export Isberg sprite…, Export SVG / CSS…–Export As, preset to that format.
Export Sprite sheet + JSON…, Export Godot SpriteFrames…–The sheet dialog, preset to JSON hash or Godot.
Export LPC sheet…–LPC sheets.
Export normal map (_n.png)…–A normal map PNG of the current frame (Shape: dome, bevel or luma).
Export slices…–Export slices.

Export As

FormatExtensionNotes
PNG.pngOne file per frame. A palette PNG when Indexed PNG/APNG when exact is on and there are 256 colors or fewer; grayscale sprites write gray+alpha. The color profile is tagged.
PNG sequence.pngLike PNG, with a default name of <name>-{frame01}.png.
Animated PNG.apngSee Animated PNG.
Animated GIF.gifOne shared palette (up to 255 colors plus transparency; extra colors are reduced). Alpha below 128 becomes transparent. Delays have 10 ms resolution, minimum 20 ms. Always loops forever. Profiled colors are converted to sRGB.
Animated WebP, WebP (still).webpLossless; animations loop forever.
JPEG.jpgFlattened on the background color (white when none is set). Uses Quality.
TIFF, AVIF.tiff, .avifOne file per frame; TIFF uses deflate, AVIF is lossless.
Isberg sprite (.isbsprite).isbspriteEditable copy limited to the selected frames (and to one layer with Selected layer).
SVG.svgOne rectangle per run of equal pixels, crisp edges, colors in sRGB.
CSS box-shadow (+ HTML).css + .htmlA box-shadow sprite with a sample page; several frames animate with @keyframes.
Preview PNG (checker + grid)-preview.pngEnlarged frames on a checkerboard with a grid.
FieldValues (default)
Format, File (… opens a save dialog)last used, else PNG
Scale1–64 (1), nearest neighbor
AreaCanvas, Selection (its bounding rectangle), Slice: <name>
LayersVisible layers, Selected layer (…), Each layer separately, All layers (incl. hidden)
FramesAll frames, Current frame (N), Tag: <name>, Range… with From/to (0-based frame indices)
Animation directionAs tags say, Forward, Reverse, Ping-pong, Ping-pong reverse
Split tags (one output per tag)off
Composite on background color + Backgroundoff, #000000
Quality (JPEG/WebP/AVIF)1–100 (95); WebP and AVIF are written lossless, so this affects JPEG
Indexed PNG/APNG when exacton
APNG plays (0 = loop)last used, else the imported play count, else 0

The preview shows the first output and lists the file names. Settings are remembered.

File name tokens

The File path may contain {title}, {layer}, {tag}, {frame}, {tagframe}, {group}, {index}, {duration} and {extension}. Digits set padding and start: {frame001} counts 001, 002…; {frame00} counts 00, 01…. Without tokens, still formats with several images get the frame index appended. Characters not allowed in file names become _; duplicate names get _1, _2.

Animated PNG

  • Writes real APNG: every selected frame as a full-canvas frame, with exact delays and the play count.
  • Indexed sprites keep one global palette without renumbering, merging duplicates or dropping unused slots, as long as every frame's pixels still match their stored indices and all frames share one palette.
  • When slot identity is ambiguous, frame palettes differ, or compositing creates new colors, the frame is written as exact RGB/RGBA (never quantized) and the export toast lists the reason.
  • Unedited imported delays stay exact; edited millisecond delays must be exactly representable, otherwise the export is rejected rather than rounded.
  • Profiles, text, physical size and safe ancillary data are copied; image-specific EXIF, timestamps and histograms are not.
Limits. APNG export allows 1–1000 frames, 65535 pixels per side, 16,777,216 displayed pixels in total and 128 MiB of output. It does not reproduce the original frame rectangles, disposal choices or compression of an imported APNG, and an excluded default image becomes the first frame (with a warning). High-precision sprites must be baked to 8-bit first, or export single frames as PNG16.

Export Sprite Sheet

GroupFieldValues (default)
OutputSheet image<name>-sheet.png
Data formatNo data file, JSON hash (Aseprite) (default), JSON array (Aseprite), TexturePacker hash + animations, Godot 4 SpriteFrames (.tres), Phaser 3 (JSON array + notes), Unity (JSON + import notes)
Data file (auto if empty)empty = next to the sheet (.json, or .tres for Godot)
Frame namesempty = {title} {frame}.{extension} (with layer or tag when split)
Godot res:// pathempty = res://<sheet file>
LayoutSheet typeHorizontal strip, Vertical strip, By rows, By columns, Packed (default)
Constraint + ValueNone (default), Fixed # of columns, Fixed # of rows, Fixed width, Fixed height; value 4
Merge duplicates, Ignore empty frames, Power-of-two sizeon, off, off
BordersBorder padding, Spacing, Inner padding0, 1, 0
TrimNo trim, Trim sprite (union), Trim cels
Extrude edges (px)0–8 (0)
Selectionas in Export As, plus Split layers, Each layer/tag on its own row, One sheet per layer/tagoff
  • The sheet PNG is written as a palette PNG when it has 256 colors or fewer.
  • JSON hash/array data follows the Aseprite layout (frames, frameTags, layers, slices). TexturePacker adds animations by tag. Godot writes a .tres SpriteFrames resource with one animation per tag plus a notes file. Phaser and Unity add notes files.
  • Packed sheets fail with “Sprites don't fit …” when a fixed size is too small.

Export slices

File > Export slices… (or the Slices panel button) asks for Scale (1–16) and Also write slices.json (on), then a folder. Each slice visible at the current frame is cropped from the composite and saved as <slice name>.png; slices.json lists names, colors and keys in the Aseprite layout.

LPC sheets

File > Export LPC sheet… builds an 832×1344 Liberated Pixel Cup sheet (13 × 21 cells of 64×64) from tags named <action>_<direction>, such as walk_down or slash-left, plus a .json description.

ActionRowsFramesNote
spellcast (alias cast)0–37
thrust4–78
walk8–119frame 0 is the standing pose
slash (alias attack)12–156
shoot (alias bow)16–1913
hurt206down only

Directions are up, left, down, right (aliases north/back, west, south/front, east); a tag without a direction fills down. A missing left or right row is mirrored from the other side. Frames are centered with the feet on y = 58; other frame counts are resampled by timing. Content larger than 64×64 fails.

Batch workspace

The Batch mode runs a re-runnable recipe over many files. The same recipe JSON works here, in the legacy CLI (--recipe) and in io_batch. Multi-frame inputs are processed as one animation with a shared grid, palette and trim box.

  1. Input: Add files… (images, Aseprite and Isberg sprites) or Add folder…; Clear empties the list.
  2. Recipe: pick an operation and click Add step. Each step can be enabled, moved (↑ ↓) or removed (✕). Load recipe…, Save recipe… and Preview first (process the first file without writing).
  3. Output: Folder, Format (PNG (multi-frame → sequence), Animated GIF, Animated WebP, Isberg sprite (.isbsprite), Sprite sheet + JSON, SVG), File name ({title}; tokens {title} and {index}), Scale (1–32) and Layers: Flatten (else keep layers, tags, linked cels).
  4. Run batch (or Stop). Each result card shows before/after; click it to open the result in the Editor. A recipe.json is written next to the results.
GroupOperations (parameters)
Batch / IO (frame-consistent)Fix image pixel art (scale, maxColors, mergeThreshold, removeBg, orphans, outline, palette), Pixelize (width, colors, palette, dither, method, outline), Apply palette, Reduce colors / palette lock, Remove orphan pixels, Repair outline, Remove background, Harden alpha, Merge similar colors, Scale (nearest), Scale2x (EPX), Resize to, Trim (union of frames), Add outline
FX recipe ops (per frame)Detect pixel scale and downscale (exact first), Downscale by factor, Upscale (nearest), Sprite size, Resample fake-pixel grid, Strip fake checkerboard, Remove background, Harden alpha to steps, Despeckle clusters, Dedupe colors, Dehalo, Remove orphans, Merge shades (ΔE), FX filter, Rotate, Flip, Recolor (color map)

Palette parameters take a preset name (pico-8, sweetie-16, endesga-32, gameboy, nes, resurrect-32, grayscale-4) or a hex list. Without Flatten, multi-layer inputs keep their layers and links, but tilemap layers become normal layers.

Limits. Some FX operations (Sprite size, Resample fake-pixel grid, FX filter, Rotate, Flip, Recolor) show no editable fields when added in the UI; their parameters can be set in a loaded recipe JSON.

Lua scripting

The editor runs the real Lua 5.4 interpreter, bundled as WebAssembly. Tables, closures, metatables, coroutines, integer operators and the math, string, table, utf8 and coroutine libraries all work. The host API follows the shape of Aseprite's scripting API but is a partial subset: app.apiVersion is 0, and app.capabilities lists what is supported. Collections and frame numbers are 1-based; pixel coordinates, palette indices and tile indices are 0-based; frame durations are in seconds.

Running scripts

  1. Choose File > Scripts > Open scripts folder. It opens the Data\scripts folder of the portable profile.
  2. Put .lua (or JavaScript .js) files there.
  3. Choose File > Scripts > Rescan scripts. Rescan again after editing a script; Lua source is read at scan time.
  4. Run the script from File > Scripts; Lua entries are named <file name> (Lua). Script entries are also commands in the command palette and can get shortcuts.

Cancel running Lua script stops the script and discards its edits. A script that fails to load shows as ⚠ name (failed). When the scripts folder does not exist yet, three examples are created: lua-color-ramp.lua, outline-all-frames.js and random-palette-shift.js.

local sprite = app.sprite
app.transaction('Checker layer', function()
  local layer = sprite:newLayer()
  layer.name = 'Lua checker'
  local image = Image(sprite.width, sprite.height)
  for pixel in image:pixels() do
    local value = (pixel.x + pixel.y) % 2 == 0 and 220 or 80
    pixel(app.pixelColor.rgba(value, value, value, 255))
  end
  sprite:newCel(layer, app.frame, image, Point(0, 0))
  app.layer = layer
end)

How a run works

  • Each run uses a fresh Lua VM and a copy of the active sprite. A successful run becomes one undo entry.
  • The result is discarded on an uncaught error, a timeout or cancellation, and also when, during the run, you switch or edit the sprite, change the timeline frame, layer or range, change the pixel selection, or change the view that the script also changed. Changing only the foreground or background color is kept unless the script changed the same color.
  • app.transaction can be nested. On error it restores the changes in place and keeps existing object handles; catch the error with pcall to continue.
  • Pixel edits keep the editor zoom and pan unless the script changes the view.
  • Sprites created by the script open as new tabs. print(...) writes to the developer console as [Lua] …; the last line appears in the finish toast.
  • Scripts and extensions share one execution slot; only one Lua callback runs at a time. Waiting for dialog input does not count against the time limit.

Where Lua runs

Contextapp.isUIAvailableDialogsapp.editorTimer and events
File > Scripts, or pixel_lua_uitruemodalavailableno
Headless MCP pixel_lua_runfalseDialog() returns nilnilno
Installed extension in the editortruemodal and modelessavailableyes
Headless plugin session (pixel_plugin_*)falsenilnilno
Batch CLI --scriptfalsefailnilno

Limits

ItemLimit
Execution time5 seconds by default (menu runs always use 5 s); MCP pixel_lua_run accepts 50–30,000 ms, pixel_lua_ui up to 25,000 ms. A watchdog also stops code that catches timeout errors.
Lua memory64 MiB
Script source4 MiB
Image size16,777,216 pixels per image (host buffers are outside Lua's memory)
Document2,048 frames, 512 raster layers
Limits. Lua has no file, network, process or module access: io, os, package, require, dofile, loadfile and debug are removed (so os.time and os.clock are unavailable), and Lua bytecode is refused. Not supported: Window, WebSocket, Brush, interactive tools and brushes, Editor:askPoint and Editor:cancel, Sprite.events, image file loading and saving, custom file formats, color-space APIs, tilemap image index editing, and commands not listed in app.command. app.sprites holds the input sprite and the sprites this run created, not every open tab. These are execution limits, not a security sandbox.

JavaScript user scripts

.js files in the same folder are ES modules with full access to the editor. They can export title, menu = [{ label, run(ctx) }], run(ctx) or a default function that registers commands and menu items. Their registrations are removed on rescan. JavaScript scripts are not sandboxed; run only code you trust.

Lua API reference

Everything listed here is implemented; anything not listed raises an “Unsupported” error naming the missing member. Read-only members are marked (r).

Globals and constructors

NameForms
appThe host object (below).
SpriteSprite(w, h[, colorMode]), Sprite{width, height, colorMode, transparentColor} or an ImageSpec, Sprite(other) (copy). Color modes 'rgb', 'indexed' (gets a 256-entry gray palette), 'grayscale'. The new sprite becomes active.
ImageImage(w, h[, colorMode]), Image{…} or an ImageSpec, Image(image) (clone), Image(image, rect) (crop), Image(sprite) (composite of frame 1).
ColorColor(), Color(r, g, b[, a]), Color(pixel), Color('#rrggbb[aa]'), Color{r=,g=,b=,a=}, {gray=}, HSV {h, s, v, a}, HSL {h, s, l}, {index=} (active frame palette), {hex=}.
Point, Size, RectanglePoint(x, y); Size(w, h); Rectangle(x, y, w, h), Rectangle(point, size), table forms. Values are rounded to integers.
ImageSpec, GridImageSpec{width, height, colorMode, transparentColor}; Grid{origin=Point, tileSize=Size} (default 16×16).
PalettePalette([n=256]) (up to 65,536), Palette(palette) (copy).
SelectionSelection(), Selection(rect), Selection(selection).
DialogSee Lua dialogs. Returns nil without UI.
TimerInstalled extensions only. See Timers and events.

Constants

TableMembers
ColorModeRGB, GRAY, INDEXED, TILEMAP
BlendModeNORMAL, MULTIPLY, SCREEN, OVERLAY, DARKEN, LIGHTEN, COLOR_DODGE, COLOR_BURN, HARD_LIGHT, SOFT_LIGHT, DIFFERENCE, EXCLUSION, HSL_HUE, HSL_SATURATION, HSL_COLOR, HSL_LUMINOSITY, ADDITION, SUBTRACT, DIVIDE
AniDirFORWARD, REVERSE, PING_PONG, PING_PONG_REVERSE (there is no AnimationDirection table)
FlipTypeHORIZONTAL, VERTICAL
RangeTypeEMPTY, LAYERS, FRAMES, CELS, COLORS, TILES, SLICES
MouseButtonNONE, LEFT, RIGHT, MIDDLE, X1, X2
MouseCursorARROW, CROSSHAIR, HAND, MOVE, SIZE_NS, SIZE_WE, SIZE_NWSE, SIZE_NESW, NO, IBEAM

app

MemberDescription
app.sprite / activeSpriteActive sprite; assignable.
app.layer / activeLayerActive layer or group; accepts a Layer or a layer name.
app.frame / activeFrameActive frame; accepts a Frame or a number.
app.cel / activeCel, app.image / activeImage (r)Active cel and its image (nil when a group is active).
app.sprites (r), app.site (r), app.range (r), app.tag (r)Sprites of this run; {sprite, layer, frame, cel}; the timeline range; the tag at the active frame.
app.fgColor, app.bgColorForeground and background colors; accept a Color, table, packed integer or hex string.
app.params (r)Script parameters (from MCP or --script-param).
app.editor (r)The Editor, or nil when headless.
app.isUIAvailable, app.apiVersion, app.version, app.capabilities (r)UI flag; 0; host version string; supported objects, commands, unsupported items and limits.
app.transaction([label,] fn)Runs fn as one undoable step; rolls back on error.
app.refresh()Accepted; does nothing.
app.alert(text) or app.alert{title, text, buttons}Returns the 1-based button index (0 if closed). Fails headless.
app.command.<Name>(params)See below.
app.pixelColorrgba, rgbaR, rgbaG, rgbaB, rgbaA, graya, grayaV, grayaA, tile, tileI, tileF
app.eventsInstalled extensions only. See Timers and events.

Sprite

KindMembers
Propertieswidth, height (writable: canvas size anchored top-left), colorMode (r), id (r), bounds (r), gridBounds, pixelRatio, filename, layers (r; top level), frames (r), cels (r), palettes (r; one per run of frames sharing a palette), tags (r), slices (r), tilesets (r), selection, transparentColor (r), spec (r), isModified (r; changed by this run), data, properties (r)
LayersnewLayer(), newGroup(), deleteLayer(layer | name) (a group deletes its children; the last layer cannot be deleted)
Frames and celsnewFrame([n | frame]) (copy), newEmptyFrame([n]), deleteFrame([frame]), newCel(layer, [frame], [image], [position]), deleteCel(cel) or deleteCel(layer, frame)
Whole spriteresize(w, h) (nearest neighbor), crop(rect), flatten(), setPalette(palette), close()
Tags and slicesnewTag(from, to), deleteTag(tag | name), newSlice([rect]), deleteSlice(slice | name)
TilesetsnewTileset(grid | rect | tileset, [count]), deleteTileset(tileset | n), newTile(tileset, [index]), deleteTile(tile) or deleteTile(tileset, index)
PrecisionsetPrecision('uint16' | 'float32' | 'uint8') (see Precision)

Layer, Frame and Cel

ObjectMembers
Layersprite (r), parent (reparent into a group or the sprite), stackIndex (1-based among siblings), layers (r; groups), name, opacity (0–255), blendMode, isVisible, isEditable, isContinuous, isReference, isImage/isTilemap/isGroup (r), isCollapsed/isExpanded (groups), isBackground (r; always false), color, data, tileset (tilemap layers), cels (r), properties (r), cel(frame)
Framesprite, frameNumber, cels, previous, next (all r), duration (seconds, up to 65.535)
Celsprite, layer, frame, frameNumber, bounds (all r), image, position, opacity, zIndex, data, properties (r)

Group handles stay distinct even when groups share a name. Renaming or reparenting a group updates its descendants; a failed transaction restores handles, paths and metadata. Group opacity and blendMode read nil and cannot be set.

Image

KindMembers
Properties (r)width, height, id, version, colorMode, bytesPerPixel, rowStride, bounds, spec, precisionMode
PixelsgetPixel(x, y) (packed RGBA, palette index, or gray with alpha), drawPixel(x, y, color) / putPixel, pixels([rect]) iterator (it.x, it.y, it() reads, it(v) writes)
Whole imageclear([rect][, color]), clone(), drawImage(src, position[, opacity[, blendMode]]), drawSprite(sprite, [frame], position), resize(w, h) (nearest neighbor), flip([FlipType]), isEmpty(), isPlain(color), isEqual(image)

Images store native RGBA32, index8 or gray-alpha16 data; indexed images keep duplicate palette colors distinct. To crop, use Image(image, rect). Indexed drawImage needs an indexed source, normal blending and full opacity.

Palette, Selection and Range

ObjectMembers
Palette#palette, size, frame, frameNumber (r), getColor(i), setColor(i, color), resize(n), ==. Changes keep native pixel indices and apply to the palette's run of frames.
Selectionbounds (r), origin, isEmpty (r), contains(point | x, y), select, add, subtract, intersect (rectangle or selection), selectAll(), deselect(). The editor receives the final mask.
Rangesprite, type, isEmpty (r), layers, frames, cels, images (deduplicated), editableImages (skips locked layers and locked groups), colors, tiles, slices, contains(…), containsColor(i), clear(). A disjoint range returned to the editor becomes its bounding range.

Tag, Slice, Tileset and Tile

ObjectMembers
Tagsprite, frames (r), fromFrame, toFrame, aniDir, repeats (0–65535), name, color, data, properties (r)
Slicesprite (r), name, color, data, bounds, center, pivot (stored as a key at the active frame; nil clears), properties (r)
Tileset#tileset, size (r), name, baseIndex, color, data, grid (r), properties (r), tile(i), getTile(i) (image)
Tileindex (r), image (same size as the tileset), color, data, properties (r). Tile 0 is the empty tile.

Properties

Sprite, Layer (including groups), Cel, Tag, Slice, Tileset and Tile have properties. Read with p.key, write with p.key = value, delete with p.key = nil; nested tables and arrays come back as writable proxies; #p and pairs(p) work. p('namespace') returns a named extension namespace (one level deep). Large 64-bit integers stay exact as decimal strings. rawset and table.insert do not change host properties.

Editor and value types

  • Editor (UI only): sprite (r), zoom (1/64 to 256, fractional), scroll (the sprite point at the view center, fractional), mousePos and spritePos (r, last known pointer positions). View changes commit with the run and roll back with a failed transaction.
  • Color: red, green, blue, alpha, gray, index, hex, rgbaPixel (r), grayPixel (r), hue/hsvHue, saturation/hsvSaturation, value/hsvValue, hslHue, hslSaturation, lightness/hslLightness.
  • Point supports ==, +, -; Rectangle has isEmpty, origin, size, contains, intersects, intersect, union.

Precision extensions

These are Isberg Labs extensions, not part of Aseprite's API.

  • sprite:setPrecision('uint16' | 'float32' | 'uint8'). 'uint16' can become 'float32'; float to uint16 is refused; 'uint8' explicitly reduces precision.
  • On cel images of a precision sprite: image.precisionMode, getPixel16(x, y)/drawPixel16(x, y, {r, g, b, a}) (integers 0–65535) and getPixelFloat/drawPixelFloat (linear sRGB, alpha 0–1).
  • Byte image methods, image copies, newCel, resize, crop, flatten, palette changes and most commands refuse precision sprites. Transactions, saves and MCP keep the exact values.

app.command

GroupCommands and parameters
StructureNewLayer{name=}, NewFrame, NewEmptyFrame, RemoveLayer, RemoveFrame, FlattenLayers, DuplicateLayer (layers, tilemap layers and whole group trees), DuplicateSprite{ui=false, filename=, flatten=} (flatten needs RGB), ReverseFrames
GeometryFlip{orientation='horizontal' | 'vertical'} (whole active cel), CanvasSize{width=, height=}, SpriteSize{width=, height=}
Pixels and selectionClear (honors the selection), Fill (foreground color, keeps native indices; not on tilemap layers), SelectAll, MaskAll, DeselectMask, InvertMask
CelsClearCel, LinkCels, UnlinkCel (use the selected frames and layers; skip locked layers), CelOpacity{opacity=0..255}
Layer stateLayerOpacity{opacity=0..255} (image layers), LayerVisibility, LayerLock (toggle; can target groups or a layer range)
NavigationGotoFirstFrame, GotoLastFrame, GotoNextFrame, GotoPreviousFrame, GotoFirstFrameInTag, GotoLastFrameInTag, GotoNextFrameWithSameTag, GotoPreviousFrameWithSameTag, GotoNextLayer, GotoPreviousLayer, ScrollCenter (UI only)

The newer commands reject unknown parameters; pixel commands reject an active group. In an extension, app.command can also call the extension's own registered command ids.

Lua dialogs

In the editor, Dialog creates real local windows. Dialog(), Dialog('title') or Dialog{title=, onclose=fn}; every widget method returns the dialog, so calls can be chained.

if not app.isUIAvailable then return end
local dialog = Dialog('Layer name')
dialog:entry{id='name', label='Name', text='New layer'}
dialog:button{id='ok', text='Create'}
dialog:button{text='Cancel'}
dialog:show()
if dialog.data.ok then app.sprite:newLayer().name = dialog.data.name end

Widgets

All widgets accept id, label, visible, enabled and focus.

WidgetFieldsValue in dataCallbacks
labeltextstring–
entrytextstringonchange (on commit)
numbertext, decimalsnumberonchange
slidermin (0), max (100), valueintegeronchange, onrelease (on commit)
check, radiotext, selected (consecutive radios form a group)booleanonclick
comboboxoptions, optionstringonchange
buttontext, focus (default button)true for the clicked buttononclick; without one, a click closes the dialog
colorcolorColoronchange
shadescolors (up to 256), mode ('pick' or 'sort')ordered Color listonclick (ev.color, ev.button)
filetitle, filename, basepath, open, save, entry, filetypespath stringonchange
canvaswidth, height (1–1024), autoscaling, mousecursor, onpaint–mouse and key callbacks (below)
tab, endtabstab{id, text, onclick}; endtabs{id, selected, onchange}selected tab idonclick, onchange (ev.tab)
separator, newrowtext (heading)––

Dialog methods and properties: show{wait=, bounds=} (modal by default), close(), modify{id=…, fields…} (also modify{title=}), repaint(), data (read a copy; assigning merges), bounds and sizeHint (r). The title bar close button and Esc close the dialog. Each non-button widget takes its own row; consecutive buttons share one.

Named tabs

Add pages with dialog:tab{id='page1', text='Page 1'} followed by their widgets, and close the group with dialog:endtabs{id='pages', selected='page1', onchange=fn}. Fields on hidden pages keep their values. dialog.data.pages holds the selected tab id, and modify{id='pages', selected='page2'} switches pages.

Limits. Tabs need explicit, non-empty ids. Anonymous tabs and alternate tab alignment are not supported.

Shades and file controls

  • shades in pick mode calls onclick with the clicked color and mouse button. In sort mode you reorder colors by dragging or Alt+←/→; data holds the new order. modify{colors=…} replaces the list.
  • file opens the native single-file open or save chooser. entry=true allows typing the path; open=false needs save=true; up to 32 filetypes. The chosen path goes into data and runs onchange. Choosing a path never reads or writes the file and grants Lua no file access. Cancelling leaves the path unchanged.

Canvas and GraphicsContext

local dialog = Dialog('Preview')
dialog:canvas{id='view', width=64, height=32,
  onpaint=function(ev)
    local gc = ev.context
    gc.color = Color('#243447')
    gc:fillRect(Rectangle(0, 0, gc.width, gc.height))
    gc.color = Color('#f0c070')
    gc:fillText('Local Lua', 2, 8)
  end,
  onmousedown=function(ev)
    if ev.button == MouseButton.LEFT then
      app.image:drawPixel(math.floor(ev.x), math.floor(ev.y), app.fgColor)
      dialog:repaint()
    end
  end}
dialog:button{text='Done'}:show()
GraphicsContextMembers
Propertieswidth, height (r), color, opacity (0–255), strokeWidth, blendMode (all blend modes except subtract and divide), antialias (only true)
State and pathssave(), restore(), beginPath(), closePath(), moveTo, lineTo, cubicTo, rect, oval, roundedRect(r, rx[, ry]), clip(), stroke(), fill()
DrawingstrokeRect, fillRect, fillText(text, x, y), measureText(text), drawImage(image, x, y), drawImage(image, srcRect, dstRect) or eight numbers
  • The context is only valid inside onpaint. Drawing is recorded and shown after the callback succeeds; show() paints every canvas and repaint() repaints them.
  • Mouse callbacks onmousedown, onmouseup, onmousemove, ondblclick, onwheel get x, y (canvas coordinates), button, pressure, deltaX, deltaY and altKey, ctrlKey, shiftKey, metaKey, spaceKey. Key callbacks onkeydown, onkeyup get key, code, repeatCount and the modifiers; keys the canvas handles do not reach the editor.
  • Images are drawn as an 8-bit preview; indexed and grayscale palettes are resolved and precision data is not changed. Text uses a local 12-px monospace font.
  • A document change made in a dialog callback is one undo step; a failed callback discards its changes.
Limits. Per dialog: 256 widgets, 16 canvases, 1,048,576 canvas pixels in total. Per paint: 2,048 drawing commands, 64 saved states, 65,536 image-preview pixels and 16 KiB of text per call; coordinates within ±10,000,000. Not supported: theme drawing (theme, drawThemeImage, drawThemeRect), antialias=false, subtract and divide blending, touch magnify, drag capture outside the canvas, and automatic canvas resizing with the window. Rendering is not identical to Aseprite's. Modal one-shot scripts cannot use show{wait=false}; see Modeless dialogs.

Lua extensions

Extensions are Aseprite-style script packages that stay loaded. Each runs in its own persistent Lua worker: init(plugin) registers commands and menus, command callbacks keep their Lua closure state, and exit(plugin) runs when the extension is unloaded or the app closes normally.

Installing and managing

  • File > Scripts > Extensions > Install local Lua extension… accepts a .lua file, a package.json (directory package), a .zip or an .aseprite-extension. The source is validated, then copied to Data\lua-plugins\<name> in the portable profile; nothing is downloaded or installed into Windows. Installing a name that is already loaded reloads it.
  • Open extensions folder shows that folder. Unload extension… runs exit and disables the extension, so it does not load at the next start.
  • Enabled extensions load at startup (up to 16). Their commands appear in the extension's submenu (File > Scripts > Extensions > name) or in the menu their group maps to, in the command palette, and in Keyboard Shortcuts.

Packaging

{
  "name": "local-tools",
  "displayName": "Local Tools",
  "version": "1.0.0",
  "categories": ["Scripts"],
  "contributes": { "scripts": [{ "path": "./main.lua" }] }
}
  • name must start with a letter or digit and may contain letters, digits, ., _ and - (up to 128 characters); version is required. A standalone .lua gets a generated manifest with version 0.0.0.
  • Only contributes.scripts is used; themes, palettes, languages, native libraries and other contributions are ignored. Scripts initialize in manifest order and exit in reverse order.
  • Script paths may start with ./ but must match case exactly and cannot be absolute, use drives or backslashes, or leave the package.
  • ZIP archives may use stored or deflate entries and one enclosing folder. Encrypted, split, ZIP64, symlink and special entries are refused. Archives are read in memory, never extracted.
Limits. 32 MiB per archive or expanded package, 8 MiB per non-script entry, 2,048 entries, 256 KiB manifest, 32 scripts and 4 MiB of Lua source per extension. Source must be strict UTF-8; bytecode is refused. Per extension: 256 commands and 128 menu groups or separators.

Plugin object

function init(plugin)
  plugin.preferences.count = plugin.preferences.count or 0
  plugin:newCommand{
    id='MyCommand', title='My local command', group='file_scripts',
    onclick=function()
      plugin.preferences.count = plugin.preferences.count + 1
      app.sprite:newLayer().name = 'Run '..plugin.preferences.count
    end,
    onenabled=function() return app.sprite ~= nil end
  }
end
function exit(plugin)
  plugin.preferences.lastExit = 'clean'
end
MemberDescription
name, displayName, version, path (r)From the manifest; path is the installed folder.
preferencesA table saved as JSON after each successful operation. Nested tables up to depth 32 and 256 KiB; no functions, cycles, document handles, non-finite or unsafe 64-bit numbers (store big integers as strings).
newCommand{id, title, group, onclick, onenabled, onchecked}Registers a command (onclick required). onenabled and onchecked must not edit the document.
newMenuGroup{id, title, group}, newMenuSeparator{group}Custom submenus and separators.

Register commands and menus during init. Menu groups file_scripts and file go to the extension's own submenu; edit, sprite, layer, frame, select, view, filters and help go to those menus. Any other Aseprite group id is placed in the extension's submenu.

  • Each callback receives a fresh atomic copy of the current sprite; fetch app.sprite and other handles again inside every callback, because handles from earlier callbacks expire.
  • A successful document change is one undo step. An uncaught error, timeout or cancellation ends the extension's session and discards that callback's document and preference changes; reinstall or restart to resume from the last saved preferences.
  • Moving the Pixel editor into its own desktop window, or gathering it back, restarts the extensions: preferences and exit edits carry over, closures and open dialogs are recreated.

Modeless dialogs

In an installed extension, Dialog:show{wait=false} returns immediately and opens a window that stays open. Each later click, change or close callback runs against the currently selected sprite with its own time limit and undo step, and the editor stays usable in between.

function init(plugin)
  plugin:newCommand{id='PaintTool', title='Paint tool', onclick=function()
    local dlg = Dialog{title='Persistent paint tool'}
    dlg:entry{id='name', text='Painted'}
    dlg:button{text='Apply', onclick=function()
      app.layer.name = dlg.data.name
      app.image:drawPixel(0, 0, Color('#ff8844'))
    end}
    dlg:button{text='Close'}:show{wait=false}
  end}
end
  • modify, data, bounds, close and onclose work across callbacks. A modeless callback may open a modal dialog and continue after it.
  • Editing a sprite while its callback runs discards that callback's result. Use onclick rather than onchange for check boxes and radio buttons in modeless dialogs.
  • Open windows are not restored after a reload.
Limits. 16 open windows and 1 MiB of dialog state per extension, 64 queued UI events. Custom docking, window dragging and resizing, and parent dialogs are not implemented; bounds can position and size a dialog.

Timers and events

  • Timer{interval=seconds, ontick=fn} with start(), stop() and read-only interval and isRunning. Intervals run from 1/60 to 3600 seconds. Each tick is one atomic, cancellable callback; missed ticks are dropped, and ticks wait while you draw or transform a selection.
  • app.events:on(name, fn) returns a listener id; app.events:off(id) or off(fn) removes it. Supported names: sitechange (sprite, layer or frame change), fgcolorchange, bgcolorchange. Callbacks get no event argument; repeated pending events are merged.
  • Not supported: beforesitechange, beforecommand, aftercommand, Sprite.events.
Limits. 64 timers (16 running), 256 listeners and 64 event callbacks per second per extension. Timers and events exist only in installed extensions in the editor.

What extensions can access

Extensions get the documented host API and nothing else: no file system, network, processes, other package files or Lua modules. They cannot call another extension's commands, define file formats or keep document handles between callbacks. Time and memory limits are execution limits, not a security sandbox; install only extensions you trust.

Extensions through MCP

Headless sessions: pixel_plugin_inspect (validate without running), pixel_plugin_open (start a session on a sprite), pixel_plugin_invoke, pixel_plugin_status, pixel_plugin_save and pixel_plugin_close. Up to 16 sessions; only the active sprite is saved, as .isbsprite. pixel_plugin_ui drives extensions loaded in the running editor, including modeless dialogs (dialogs, dialog-event, dialog-begin); use begin and status for commands that wait on a dialog.

Batch command line

cli\aseprite-compat.mjs is a strict, ordered batch front end that follows the option names of Aseprite's command line for the subset it implements. It uses the same codecs, document model, sheet packer and Lua runtime as the editor. It does not claim full command-line parity.

Running the batch CLI

The portable folder contains everything needed; no separate Node.js install is required. Like the studio, the batch CLI needs this device's activated license or trial (see License commands); --help, --version and --capabilities work without one. In PowerShell, from the portable folder:

$env:ELECTRON_RUN_AS_NODE = '1'
& '.\Isberg Labs.exe' '.\resources\app\cli\aseprite-compat.mjs' -b '.\Projects\hero.aseprite' --save-as '.\Projects\frame001.png'
Remove-Item Env:\ELECTRON_RUN_AS_NODE

This writes frame001.png, frame002.png and so on for an animation. .\resources\app\cli\gamebench.js hands over to the same front end when the arguments include -b, --batch, --aseprite-compat, --script, --script-param or --capabilities. Use -b --help for help and -b --capabilities for a machine-readable report of supported and unsupported options.

Caution. While ELECTRON_RUN_AS_NODE is set, Isberg Labs.exe (and Start Isberg Labs.cmd started from that window) runs as a command-line runtime instead of opening the app. Remove the variable afterwards, or use a separate PowerShell window for batch work.
Tip. Quote every argument that contains {…} tokens; unquoted braces are PowerShell script blocks. In Windows PowerShell 5.1, write --data= rather than --data '', because an empty argument is dropped and the next argument would be taken as the data path.
& '.\Isberg Labs.exe' '.\resources\app\cli\aseprite-compat.mjs' -b --tag walk --layer Body '.\Projects\hero.aseprite' --save-as '.\Projects\walk.gif'
& '.\Isberg Labs.exe' '.\resources\app\cli\aseprite-compat.mjs' -b --list-tags '.\Projects\hero.aseprite' '.\Projects\effects.isbsprite' --sheet-pack --trim --sheet '.\Projects\atlas.png' --data '.\Projects\atlas.json' --format json-array
& '.\Isberg Labs.exe' '.\resources\app\cli\aseprite-compat.mjs' -b '.\Projects\hero.isbsprite' --script-param color=#cc44ff --script '.\Projects\edit.lua' --save-as '.\Projects\edited.isbsprite'
& '.\Isberg Labs.exe' '.\resources\app\cli\aseprite-compat.mjs' -b '.\Projects\hero.aseprite' --save-as '.\Projects\out\{title}-{tag}-{frame001}.png'

How arguments are read

  • Options take one or two dashes and accept --opt value or --opt=value. Use the = form for values that start with a dash. -- ends option parsing.
  • Input options must come before the file they affect and stay in force for later files.
  • Operations (--save-as, --scale, --shrink-to, --palette, --color-mode, --script) run in order. --scale, --shrink-to and --color-mode act on every input opened so far; --palette, --script and an untemplated --save-as act on the latest input.
  • Output settings (trim, crop, slice, filename format, ignore empty) apply to --save-as operations after them. The sheet and data file are built at the end from the final state of all inputs.
  • Unknown options, unsupported options, bad values and misplaced input options are errors; nothing is silently ignored.

Supported options

OptionArgumentMeaning
FILEpathOpens an input. A still image whose name ends in digits loads the whole contiguous numbered sequence (up to 2,048 frames; stops at a gap).
--layer (--import-layer)NAMEInput: include only this layer or group; repeatable; accepts group/name paths and * wildcards.
--ignore-layerNAMEInput: exclude a layer or group; repeatable.
--all-layers–Input: include hidden layers (reference layers are always excluded).
--tag (--frame-tag)NAMEInput: only this tag's frames, in the tag's direction.
--frame-rangeFROM,TOInput: zero-based inclusive range, relative to the tag when one is selected.
--oneframe–Input: load only the first frame (also disables numbered sequences).
--split-layers, --split-tags, --split-slices–Input: one output group per layer, tag or slice.
--split-grid–Input, sheets only: cut each frame into whole grid cells.
--export-tileset–Input, sheets only: put the tiles of selected tilemap layers in the sheet, deduplicated per tileset.
--list-layers, --list-layer-hierarchy, --list-tags, --list-slices–Input: print names (when there is no --data) and add layers, frameTags or slices to the JSON data.
--save-asFILESaves the latest input, or every open input when FILE contains tokens. Captured at this point in the command line.
--scaleFACTORNearest-neighbor resize (fractions allowed).
--shrink-toW,HShrinks to fit inside W × H, keeping proportions; never enlarges.
--paletteFILEReplaces the latest input's palette (.gpl, .pal, .hex, .txt, .act, an image, or a sprite document). Indexed pixels keep their slots; RGB pixels do not change.
--color-modergb | grayscale | indexedConverts all inputs opened so far.
--dithering-algorithmnone | ordered | old | error-diffusionUsed by a following --color-mode (default none).
--dithering-matrixbayer2x2 | bayer4x4 | bayer8x8Default bayer8x8.
--script-paramname=valueA string parameter for following scripts (app.params).
--scriptFILE.luaRuns Lua 5.4 against the latest input (5-second limit, no dialogs). The returned active sprite is used afterwards.
--trim, --trim-sprite, --trim-by-grid–Trim saved images to opaque pixels (by grid cells for the last). In sheets, --trim trims each frame and --trim-sprite uses one box per input.
--cropx,y,w,hCrop rectangle.
--sliceNAMEOutput only that slice's area, per frame.
--ignore-empty–Drop fully transparent frames.
--filename-formatTEMPLATEOutput file names for --save-as, or frame names in the JSON data.
--sheetFILE.pngOne sheet combining all inputs.
--dataFILE, or emptyJSON metadata; --data= prints it to the console. Without --sheet only metadata is written.
--formatjson-hash | json-arrayData layout (default json-hash).
--sheet-typehorizontal | vertical | rows | columns | packedDefault rows. --sheet-pack is the same as packed.
--sheet-width, --sheet-height, --sheet-columns, --sheet-rowsintegerFixed sheet size or count per line.
--border-padding, --shape-padding, --inner-paddingintegerSpace around the sheet, between frames, and inside each frame (default 0).
--extrude–Repeats edge pixels by 1 px.
--merge-duplicates, --power-of-two-size–Share identical frames; round sheet sizes up to powers of two.
--tagname-formatTEMPLATENames of the frameTags entries.
-b (--batch)–Batch marker (optional when calling aseprite-compat.mjs directly).
-p (--preview)–Prints the planned operations without loading inputs, running scripts or writing files.
-v (--verbose)–Prints each file written.
-h, -? (--help), --version, --capabilities–Help, version, and the capability report.

Template tokens

--save-as, --filename-format and --tagname-format accept {fullname}, {path}, {name}, {title}, {extension}, {layer}, {group}, {tag}, {innertag}, {outertag}, {slice}, {duration}, {frame} and {tagframe}. Digits set the start and padding: {frame} gives 0, 1…, {frame1} 1, 2…, {frame001} 001, 002…. {frame} counts within the output group (after tag ordering), not the source frame number. Using {layer}, {tag} or {slice} turns on the matching split. Values taken from names are cleaned for file names. Tokens in --sheet are checked but not expanded.

Formats

  • Inputs: .isbsprite, .gbsprite, .pforge, .aseprite, .ase, PNG and APNG (indexed and Adam7 kept), GIF and WebP (animated), JPEG, TIFF and AVIF. Folders are not accepted.
  • --save-as: png, jpg/jpeg, tif/tiff, avif (one file per frame), apng, gif, webp (animated), isbsprite/gbsprite (editable). An indexed document saves as a native indexed PNG with its palette order, duplicate and unused slots and indices. APNG keeps the imported play count.
  • --sheet: PNG only. --data: JSON only.

Unsupported options

OptionReason given
--shellInteractive Lua REPL is not implemented; use --script.
--play-subtagsNested tag playback with independent repeats is not yet implemented.
--debugThe reference desktop debug-log mode is not implemented; use --verbose.
--noinappThis local application has no Steam integration.
  • Saving to .ase, .aseprite or .pforge is refused (import-only). SVG, CSS and BMP are not batch outputs.
  • Custom dithering matrices from extensions are not available. Palette matching and packing coordinates are not claimed to equal Aseprite's output byte for byte.
  • Indexed PNG output fails, instead of guessing, for colors outside the palette, duplicate-color pixels without stored indices, sheets mixing palettes or profiles, and duplicate merges that would discard different indices. Add an explicit index edit, share the palette, drop --merge-duplicates, or use --color-mode rgb.
  • Editable slice output needs constant slice bounds across the selected frames; editable tilemap scaling needs whole-number tile sizes.

Errors and writing

  • The whole command line is checked first, then every operation runs in memory and every output is encoded before any file is written; a script or encoding error writes nothing. A disk error during the final write phase can leave earlier files written.
  • Exit code 0 on success; on error 2 when run directly, 1 through gamebench.js. Existing output files are overwritten without asking.
  • --preview checks syntax only; it does not check that files, layers or tags exist.

Other command-line tools

Without -b, gamebench.js runs the older Isberg batch command, which processes each input separately and offers repair and color operations (--repair-grid, --pixelize, --remove-bg, --palette with preset names, --max-colors, --dither, --outline, --recipe), more sheet data formats (--format texturepacker|godot|phaser|unity, --data out.tres) and APNG options (--loop, --format-out apng). Run it with --help for the list; see Command-line tools. cli\pxl.js builds PXL files (see PXL command line).

Keyboard shortcuts

Edit > Keyboard Shortcuts… (Ctrl+Alt+Shift+K, also in the Help menu) lists every command. Search by name or key; filter by conflicts or changed. Click a key to record a new one (Esc cancels), × removes a key, + adds one, ↺ resets a command. Conflicts show which other command uses the key, with Remove there and Remove here. Reset all, Export… (a JSON keymap) and Import… (replaces your changes). Keys typed in text fields and open dialogs are not treated as shortcuts.

AreaDefault keys
FilesCtrl+N new, Ctrl+O open, Ctrl+S save, Ctrl+Shift+S save as, Ctrl+W close, Ctrl+Shift+W close all, Ctrl+Alt+Shift+S export as, Ctrl+Alt+E export sheet, Ctrl+Shift+X repeat export
EditCtrl+Z, Ctrl+Y, Ctrl+C, Ctrl+Shift+C, Ctrl+X, Ctrl+V, Ctrl+Shift+V, Ctrl+Alt+V, Del, Alt+Backspace fill, Ctrl+T transform, Ctrl+B brush from selection, Shift+H/Shift+V flip
SelectCtrl+A, Ctrl+D, Ctrl+Shift+D, Ctrl+Shift+I, Enter commit, Esc cancel
View0 fit, # pixel grid, Ctrl+' tile grid, Shift+' snap, F3 onion skin, F7 preview, Ctrl+F7 preview follow, Ctrl+Tab next tab
SpriteCtrl+P properties, Ctrl+Alt+I sprite size, Ctrl+Alt+C canvas size
LayersShift+N new, Ctrl+J via copy, Ctrl+Shift+J via cut, Shift+P properties, F2 rename, Ctrl+E merge down, Alt+↑/↓ select
FramesAlt+N, Alt+Shift+N, Alt+C, Alt+I, Alt+P, Alt+L, Alt+T; Space play, ←/→ (or ,/.), Home, End
FiltersCtrl+I invert, Ctrl+U hue/saturation
Brushes and colors[/] size, Alt+1…9 recall slot, Ctrl+Alt+1…9 save slot, X swap colors
OtherCtrl+Space command palette, Ctrl+Shift+B build PXL. Tool keys are in Drawing tools.

Scope and limits

The editor reads Aseprite, PNG/APNG and other formats and follows Aseprite's document model, CLI option names and scripting API shape where they are implemented. It is not certified as 1:1 equivalent to Aseprite or any other tool, and Aseprite files are import-only.

  • Preserved: linked cels across positions and frame palettes, off-canvas pixels, exact palette indices through strokes, typed index edits, Lua image edits, clipboard and transforms, tile IDs and flips through the tile clipboard, group identity and empty groups, typed properties, fractional reference placement, and external tilesets embedded on save. Edits that cannot keep indexed identity fall back to explicit RGBA rather than guessing.
  • Not certified: the exact behavior of every native tool, ink and gesture, every indexed brush or effect path, and pixel or packing equivalence with the original application. Finite test fixtures do not establish every authoring path.
  • Re-encoding: indexed PNG export keeps validated palette and index identity but writes a new non-interlaced PNG; APNG export does not reproduce the original frame layout or compression.
  • High precision: exact uint16 and linear float32 planes support numeric editing, compositing, undo, saving, PNG16 and bounded OpenEXR output, but the display is an 8-bit preview and legacy editing operations refuse precision sprites. Arbitrary HDR variants, EXIF geometry and thumbnail regeneration, and semantic editing of every PNG ancillary chunk are incomplete.
  • Lua: app.apiVersion is 0. Timers, events and modeless dialogs exist only in installed extensions; Window, sprite and command events, askPoint, custom file formats, the remaining Aseprite commands and non-script extension contributions are absent. Scripts have no network, process or file-system access.
  • No generative AI: repair, pixelizing, analysis and art-as-code tools are deterministic algorithms that run locally.

MCP tools

These local MCP tools work on sprites and images in your project. Edits that save files reload live in the open editor. See MCP for setup.

Inspect and critique

Draw and edit

Repair and clean

Palettes, color and precision

Animation, slices and tiles

Art as code, import and export

Lua and extensions

Troubleshooting

Drawing does nothing and the status bar says “Layer or parent group is locked” or “… hidden”
Unlock or show the layer and every group above it in the Layers panel.
“Reference images use the Move tool or Reference cel bounds”
The active layer is a reference layer. Pick another layer to draw, or toggle the reference flag off.
Tools, filters or exports refuse a 16-bit or EXR sprite
High-precision sprites only accept the operations in Sprite > Precision — 16-bit / HDR…. Export PNG16 or EXR from there, or choose Bake display to 8-bit (discard precision) to use the other tools.
“Reference and legacy sprite formats are import-only”
You tried to export or save as .ase, .aseprite or .pforge. Save as .isbsprite or export a standard image format.
An indexed paste is rejected
The destination palette does not match the copied slots. Use Paste as new sprite to keep the source palette, or Copy merged to paste plain colors.
A tile paste is rejected
Tile size, grid alignment, color mode or palettes differ. Paste as a new tilemap layer or new sprite, or use Copy merged for pixels.
APNG export shows warnings
Some frames could not keep native palette indices and were written as exact RGB/RGBA. The file is still correct; the toast names the reason.
“Nothing changed (layer locked?)” after a filter
Every targeted layer was locked, or the selection excluded the changed pixels. Check Apply to and Selection only.
A Lua script's changes disappear
The result is discarded if you edit the sprite, change frame, layer, range or selection, or switch tabs while it runs, and on any error or timeout. Run it again without touching the sprite. “A Lua script is already running” means another script or extension callback holds the single Lua slot.
An edited script still runs its old version
Choose File > Scripts > Rescan scripts.
An extension's commands stopped working
An error, timeout or cancellation ended its session. Install it again (Install local Lua extension… reloads it) or restart; its last saved preferences are kept.
Isberg Labs.exe opens as a command line instead of the app
ELECTRON_RUN_AS_NODE is still set in that window. Run Remove-Item Env:\ELECTRON_RUN_AS_NODE or open a new window.
The batch CLI says “requires a value” or “Unsupported save-as format .”
PowerShell consumed unquoted {…} tokens. Put the template in single quotes.
“Sprites don't fit …” when exporting a sheet
A fixed sheet width or height is too small for the frames. Remove the constraint or enlarge it.
A color-profile operation says the profile is preserved but not implemented
The file uses a color encoding the engine cannot convert. Assign sRGB, Display P3 or a local ICC profile first.

Textures & terrain

Textures & terrain (internally the Texture Studio) is a set of eleven connected tools for game textures: a PlayStation-style palette converter with .TIM export, a pixel painter that paints straight onto 3D scenes and imported models, layers and atlases, texture animation from pictures or video, seamless material synthesis, terrain sculpting with roads, rivers, foliage and baking, image restyling, pixel-art cleanup and sprite-sheet extraction. All tools share one texture library, and all processing runs on your computer.

Workspace layout

The tab bar at the top switches between the tools. Every tab works on the same project: textures you import, paint or generate in one tab are available in the others through the shared texture library.

TabWhat it does
01 PSX ConverterResizes, quantizes and dithers images into 4-bit, 8-bit or 15-bit PlayStation textures; saves PNG or .TIM; converts queues of images. See PSX Converter.
02 Texture EditorTexture library, pixel workbench and a live 3D environment preview where you assign textures to surfaces, set UVs, paint on the model and arrange props. See Texture Editor.
03 Advanced StudioLayers, rectangular selections, shared palettes, frame animation, texture atlases, GLB/OBJ scene export and autosave recovery. See Advanced Studio.
Local assetsFinds images in a local folder or in the project asset shelf. See Local assets.
05 Textures AnimatorTurns pictures or video into editable frame timelines and exports WebM, MP4, GIF or PNG sequences. See Texture animation.
06 SeamlessMakes a texture tile cleanly or blends up to four materials into one seamless material with derived maps. See Seamless materials.
07 Dimensionner XC2Terrain generation, sculpting, independent vertex channels, two UV sets, roads, rivers, foliage, baking and Godot/Blender bundles. See Terrain sculpting.
08 Library & HistoryFolders, tags, favourites, duplicate detection and project version history. See Library and history.
09 Image ClonerRestyles an image while keeping its composition, and exports metadata-free PNGs. See Image restyling.
10 Pixel 2 PixelCleans and upscales pixel art into smooth illustrations, with background removal, palette matching, recipes and SVG tracing. See Pixel 2 Pixel.
11 Sprite ExtractorSplits a sprite sheet into individual sprites without resampling. See Sprite extraction.

Most tabs hand results to each other with buttons such as Open as PSX, Open in PSX Converter, Add to texture library and Open in Pixel 2 Pixel. Copies that Seamless, Image Cloner and Pixel 2 Pixel add to the Texture Editor library are fitted within 512 pixels; their downloads keep the full resolution.

Note. Buttons that save a file open a save dialog. Ctrl+S anywhere in this editor saves the whole Isberg project (.isberg), which includes the complete Texture Studio project. Ctrl+Z and Ctrl+Y go to the shared project history first when it has a step to undo or redo; the ↶ Undo and ↷ Redo buttons in each tab always work on that tab's own history. See Projects and Workspace.

PSX Converter

The converter resamples a source image to a texture size, applies adjustments, builds a palette by median cut and dithers the result. The left column holds the settings, the centre shows the preview and the right column shows the palette and export buttons. Every change reconverts immediately.

Source images

  • Open images selects one or more images. You can also drop images on the preview or press Ctrl+V to paste. Accepted: PNG, JPEG, WebP, GIF, BMP, AVIF, SVG, ICO and other images the built-in browser engine can decode.
  • Demo scene loads a generated sunset scene that shows off every mode.
  • Opening more than one image creates a conversion queue. See Batch conversion.

Conversion settings

PanelControlOptions and range
Texture sizeSize list16 × 16, 32 × 32, 64 × 64, 128 × 128 (default), 256 × 256, 512 × 512, 1024 × 1024 · 1K, 2048 × 2048 · 2K, 4096 × 4096 · 4K, 8192 × 8192 · 8K, Original source size, Custom (Width, Height; no app maximum).
AspectSquare or Match source (the longer side gets the chosen size).
If not squareStretch, Fit and pad, Fill and crop.
Color depthDepth buttons4-bit CLUT (16 colours from a 15-bit palette), 8-bit CLUT (256 colours, default), 15-bit (direct colour, 32 levels per channel, no palette).
Index 0 is transparentReserves palette index 0 for transparency.
DitheringPatternOff, Bayer 2 × 2, Bayer 4 × 4 (default), Bayer 8 × 8, Floyd–Steinberg, Random noise.
Strength0–200 %, default 100 %.
Image adjustBrightness, Contrast, Saturation−100 to 100, default 0. Reset adjustments returns all three to 0.
Lighting & paletteEven out lighting0–100, default 0. Removes broad shading so one bright corner does not use up the palette.
Palette focusSpread evenly, Favour detail, Favour gradients.
TilingSeamless edgesOff, Blend edges, Mirror (mirrors the texture onto itself, which tiles perfectly at the cost of symmetry).
Blend width2–45 %, default 12 % (shown with Blend edges).
Preview as 3 × 3 tilesRepeats the result in the preview. Bayer dithering tiles cleanly at power-of-two sizes; Floyd–Steinberg can leave a faint seam.

Preview and 3D model

  • 2D preview / 3D preview switches the stage. Zoom: Fit, 1×, 2×, 4×, 8×.
  • Compare with source shows a draggable divider between SOURCE and CONVERTED.
  • The 3D model panel previews the texture on a Cube, Pyramid, Cylinder, Sphere or Plane, with Auto-rotate or Drag to rotate, Affine mapping (no perspective correction, like the PS1 GPU), Face shading, Vertex jitter (0–8 px, default 2) and Subdivision (0–3, default 0).

Palette editing

Click a swatch in the Palette panel to edit it, choose a colour, then use Replace color. Undo restores the original swatch. 15-bit mode has no palette to edit.

Export

  • Open texture in editor → adds the converted texture to the Texture Editor library.
  • Save PNG texture saves the converted image.
  • Save .TIM (PS1 binary) writes a PlayStation TIM file: RGB1555 colour with a CLUT for 4-bit and 8-bit modes, or direct 16-bit pixels for 15-bit mode. The CLUT is placed at VRAM position 0, 480 and the image at 0, 0. Rows are padded to whole 16-bit words. Pure black is written with the semi-transparency bit set so it stays opaque; with Index 0 is transparent, index 0 is written as the transparent colour. The panel under the buttons shows the TIM header, bits per pixel, CLUT size and file size.
  • Save settings writes all converter settings and the current palette to psx_converter_settings.json; Load settings restores them.

The header also has a language list (English, Русский, 日本語, Deutsch, Español) for the converter labels, a CRT overlay toggle, an Ambient hum toggle and a Startup chime button.

Limits. TIM stores width in 16-bit words and height in a 16-bit field, so each is limited to 65,535; larger images must be exported as PNG. Large TIM textures still need tiling for real PS1 hardware. Custom sizes have no app maximum, but memory and the canvas limits of the built-in browser engine decide what can be processed.

Batch conversion

When several images are opened, dropped or pasted, the Conversion queue appears in the Source image panel. The queue has no fixed file-count limit and processes one image at a time, so only one decoded source and result are in memory. Choose an entry in the list to preview it with the current settings.

ButtonResult
Download PNG batch ZIPOne ZIP with every queued image converted to PNG.
Download TIM batch ZIPOne ZIP with every queued image converted to .TIM.
Convert & save all PNGsConverts each image and asks where to save each result.
Convert & save all TIMsAs above, for .TIM.
Clear queueEmpties the queue.

The progress dialog shows the current file and offers Choose save location, Skip image and Stop. Output files are named <name>_psx_<width>x<height>_<depth>bit.png (or .tim).

Tip. Other tabs have their own queues: Image Cloner (Restyle queue → ZIP) and Pixel 2 Pixel (Clean queue → ZIP).

Texture Editor

The Texture Editor combines a texture library, a pixel workbench and a WebGL environment preview. Paint edits the shared texture everywhere it is used.

01 / Texture library

  • Five starter textures are included. The library holds up to 64 textures.
  • + Import textures adds images; Paste texture from clipboard (or Ctrl+V) adds a copied image.
  • Texture name renames the selected texture. Duplicate copies it so you can paint one surface independently; Remove deletes it from the library.
  • NEW PIXEL CANVAS: choose 16, 32, 64 (default), 128, 256 or 512 and press + New for a transparent canvas.
  • Export texture PNG saves the selected texture; Send to PSX Converter → opens it in the converter for palettes, dithering and .TIM export.

Color & brush and 03 / Pixel workbench

  • Pick the paint colour with the colour well or a hex value, or click a palette swatch. PSX 5-bit color (on by default) snaps colours to 5 bits per channel. MIRROR PAINTING has Horizontal and Vertical switches.
  • Tools: Brush, Eraser, Fill, Pick, Line, Rect. Size 1–32 and brush shape Square or Round.
  • Grid, 3 × 3 tiles and Zoom (Fit, 2×, 4×, 8×, 16×) control the canvas view.

Shortcuts

KeyAction
B / E / G / I / L / RBrush / Eraser / Fill / Pick colour / Line / Rectangle.
[ / ]Smaller / larger brush.
Ctrl+Z, Ctrl+Shift+Z or Ctrl+YUndo / redo painting. In Edit scene mode, unless the pixel canvas has focus, they undo and redo scene edits.
DeleteIn Edit scene mode with the 3D view focused, removes the selected object.
EscCancels a pending prop placement.
Drag / right-drag or Shift-drag / scroll3D view: orbit / pan / zoom. In paint mode, Alt-drag or middle-drag orbits. Click a surface to select it.

02 / Environment preview

The preview renders one of 25 environments: five base scenes (Country house, Old town street, Stone courtyard, Workshop interior, Material lab) and twenty more in the Urban, Industrial, Outdoor, Fantasy and Interiors categories. Five shortcut buttons sit above the view; ▦ All scenes opens the environment browser, where you can search, filter by category, pin five shortcuts and use Apply & open scene.

  • Modes: ↻ Orbit / select, ✎ Paint on model (see Painting on models) and ✥ Edit scene.
  • Reset view resets the camera. Reset scene restores the current scene's default layout; texture artwork and other scenes are kept.
  • Lighting: Daylight, Golden hour, Moonlight, Unlit textures.
  • Scene PNG ↗ saves the current view as PNG.

Arranging the scene

In ✥ Edit scene, select an object or drag it across the ground (Alt-drag orbits).

  • + Add prop opens a browser of 50 texturable props in six categories (Architecture, Furniture, Industrial, Nature, Storage, Street). Choose a prop, optionally tick Use selected texture on every part, press Place in scene, then click the ground or another surface.
  • Scene object chooses the object to edit. Position X and Position Z (−100 to 100), Height Y (−20 to 100), Rotate Y (°) (−360 to 360, step 15), Width ×, Height × and Depth × (0.1–10). Snap 0.25 is on by default.
  • Set on ground, Texture whole object, Duplicate, Remove, Place at center and Cancel placement. ↶ Undo and ↷ Redo undo scene edits. A scene must keep at least one object.

04 / Surface inspector

  • Pick a face in 3D or search the list with Find a surface. Assigned texture shows the surface's texture; Assign selected library texture applies the library selection. Apply to whole object extends the assignment to every surface of the object.
  • UV / STRETCH & TILE: Horizontal repeat and Vertical repeat (0.05–64; 1 fits one texture to the face, higher values tile it, lower values zoom in), Offset X and Offset Y (−64 to 64), Rotation (−360 to 360), Wrapping (Repeat, Mirror, Clamp edges), Flip X, Flip Y, Stretch to face and Tile to size. Each surface keeps its own mapping.

Scene settings and model import

  • Render resolution: 240p · PSX, 480p · Crisp (default), 720p · Detailed. Affine mapping, Vertex snap and Selection outline (on) toggle the PS1-style effects. Atmospheric fog 0–100, default 12.
  • Import your model (.obj) loads an OBJ smaller than 12 MB. Groups and materials become assignable surfaces; OBJs with UVs work best. Textures are added separately.
  • Open project / Save project read and write a portable Texture Studio project (psx-texture-studio.json) with textures, painting, scene assignments, UV settings, camera, animation frames and audio.

Painting on models and UVs

Choose ✎ Paint on model and drag on any surface in the environment preview. The brush paints the texel under the cursor through that surface's UV mapping, so the stroke lands on the displayed texture. Because textures are shared, every surface that uses the texture changes; Duplicate the texture first to paint one surface alone. Line and rectangle tools work only on the 2D workbench canvas; on the model, drag to paint with the brush. Alt-drag or middle-drag orbits while painting.

Imported OBJ models are painted the same way. For UV inspection of a texture, the Advanced Studio's UV wireframe option draws the assigned faces (blue) and the selected face (gold) over the canvas. Terrain meshes are painted per vertex in Dimensionner XC2.

Advanced Studio

The Advanced Studio adds layers, selections, palettes, frames and exports to the same texture library. The environment preview moves into this tab while it is open. Header buttons: Open project, Save project, Texture PNG and Open as PSX →.

01 / Texture & layers

Choose a texture in Shared texture library, or use Import images or New 64 × 64. Each frame has up to 16 layers. Set Layer name and Opacity, and use + Layer, Duplicate, Move up, Move down, Merge down and Delete layer. A hidden layer, or one at zero opacity, cannot be painted.

Color & shared palette

Pick a brush colour (5-bit color snaps it). Colors sets the palette size (16, 32, 64 or 256). Build from selected builds a palette from the textures ticked in BATCH SELECTION; Add locked color adds a colour that rebuilding keeps; Apply to selected reduces every layer and frame of the selected textures to the palette; Export palette saves shared-palette.json. A palette holds at most 256 colours.

02 / Pixel workbench and selections

  • Tools: Brush, Eraser, Fill, Pick, Select; Size 1–32; ↶ Undo, ↷ Redo.
  • View options: Grid, Wrap brush (strokes wrap across edges for tiling), Half-tile offset (view only, to check seams), UV wireframe, zoom.
  • Select a rectangle, then drag inside it to move pixels on the layer. Copy, Paste, Cut, Rotate 90°, Flip X, Flip Y, Clear selection, X/Y with Move to X / Y, and Deselect.

03 / Animation

Each texture can have up to 32 frames, each with its own layers. Use + Blank frame, Duplicate frame, Delete frame, ▶ Play in scene (needs two frames) and FPS (1–30, default 6). Export sprite sheet saves a ZIP with sprites.png and animation.json (frame rectangles, durations and looping).

Texture atlas

Tick textures in BATCH SELECTION (Select all, Clear). Choose Atlas width (256, 512, 1024 default, 2048, 4096) and Edge padding (pixels) (0–32, default 2), then Build atlas preview. Textures are packed with extruded edges. Download PNG + layout ZIP saves texture-atlas.zip with atlas.png and atlas.json.

Export your scene

Export textured GLB and Export OBJ + MTL + textures ZIP export the current environment with positions, UVs and textures. Animated textures export as their selected frame. Preview lighting and PSX distortion are not exported.

Autosave & recovery

Changes are saved to local recovery storage after a short pause. Save recovery now saves immediately; Restore last recovery reloads it. When a previous session is found at start, a bar offers Restore recovery or Keep current project; autosave pauses until you choose. Recovery copies live in the app's local browser storage and are removed if that data is cleared, so keep project files as backups.

Local assets

The Local assets tab is a local asset browser. Enter a path in Local folder path or press Choose folder, then Scan folder; Project assets lists the images on the project asset shelf. Search names… filters the results. Each result has To converter (opens it in the PSX Converter at its own size) and Add texture (adds it to the library).

Limits. The scan reads PNG, JPEG, WebP, BMP, GIF, TIFF and AVIF files, skips node_modules and .git, stops after 20,000 entries or 2,000 images, and shows at most 200 results at once. Network paths and URLs are refused.

Texture animation

The 05 Textures Animator turns pictures or a video into an editable frame timeline. Header buttons: Save animation (texture-animation.json), Open animation and Save full project.

Import & timing

  • + Multiple pictures imports images as frames; Picture working resolution: Original · up to 2048 pixels, 128, 256, 512 or 1024.
  • + Import a video: Video working resolution (long edge) 128 (default), 256, 512 or 1024; Video frame extraction: Every source frame · MP4/MOV/WebM or Sample at timeline FPS (other video formats use sampling); Start (seconds) and End (0 = full clip).
  • Timeline FPS 1–60, default 12; Apply FPS to every frame retimes all frames.
  • Append active library texture and + Blank 128 × 128 frame add frames.

Frame workbench and timeline

  • Tools: Brush, Eraser, Fill, Pick, Line, Rectangle; Size 1–64; undo and redo. Options: Pixel grid, Previous-frame ghost (onion skin), Wrap paint, zoom.
  • Timeline: first, previous, ▶ Play, next, last; Frame number; Duration ms (1–60,000, default 83) with Set duration; a scrub bar; Duplicate, Delete frame, Move earlier, Move later, Reverse, Make ping-pong loop (without duplicate end frames) and Clear timeline. Long operations show a progress bar with Cancel operation.
  • LAYERS IN THIS FRAME: layer list, name, Layer opacity, + Layer, Duplicate layer, Move up, Move down, Merge down, Delete layer.
  • Frame selection: Select all, Clear selection, From/To with Select range; Ctrl-click toggles and Shift-click selects a range. Paint selected frames together edits the same layer index in every selected frame (up to 16 million layer pixels per stroke). Flip selected ↔, Flip selected ↕, Rotate selected 90° and Move X/Y with Move selected layers.
  • In-betweens: choose Crossfade interpolation, Wipe transition, Pixel dissolve or Motion tween (X/Y), set In-betweens (1–60, default 6), select two endpoint frames and press Insert between selected endpoints. Motion tween moves the first endpoint's active layer toward Move X/Y; the others interpolate whole frame composites.

Look, audio and export

  • Preview / export style: Original colors (keeps working colours and resolution) or PSX pixel art, with PSX long edge (32, 64, 128 default, 256), Shared palette (16 colors or 256 colors, one palette for the whole timeline to reduce flicker) and Dither strength (0–100, default 65). Video pixel scale: 1×, 2× or 4× (default).
  • Export WebM video, Export frame PNG, Export PNG sequence + timing ZIP (animation-frames.zip with timing.json) and Frame → texture library.
  • AUDIO & FORMATS: Keep audio from imported video, Open soundtrack (audio or video file), Audio trim start (seconds), Start on timeline (seconds), Audio volume (0–200 %), Include soundtrack in video, Remove soundtrack, Export MP4 + audio and Export animated GIF (no audio). Sound stays on the timeline's time axis when frames are rearranged.
Limits. Up to 4,096 frames and 512 megapixels of frame artwork. WebM, MP4, GIF and audio processing use the bundled local media service.

Seamless materials

The 06 Seamless tab makes one texture repeat cleanly, or grows two to four materials into each other. Header buttons: Rebuild material, Export PNG (seamless-material.png), Export material maps ZIP, Add to library and Open as PSX.

PanelControls
TWO SOURCE MATERIALSMaterial A and Material B (library or built-in materials, or Upload A/Upload B), Blend both materials (on), Swap A / B.
MATERIALS C & DBlend material C / Blend material D with Upload C/Upload D, C coverage (default 25) and D coverage (default 20). C and D add independent seeded regions.
TILING & BLENDOutput size 128, 256 (default), 512, 1024. Seam removal: Periodic detail preservation, Soft edge matching, Mirrored quadrants. Edge feather (pixels) 1–48, default 8. Blend structure: Organic patches, Veins & cracks, Winding ribbon, Material islands. Seed 0–999999 (default 27) with Randomize. Material B coverage (default 50), Transition softness (1–100, default 35), Blend by surface detail (default 35), Rotate A/Rotate B (0, 90, 180, 270).
MATERIAL PREVIEWView: 3 × 3 seamless repeat, Single texture, Blend mask, Normal map, Height map, Roughness map. PSX preview, Tile boundaries.
PAINT THE TRANSITIONPaint blend mask, target Reveal material B or Reveal material A, Brush radius 1–128 (default 20), Strength 1–100 (default 35), Undo mask, Redo mask, Reset procedural mask. The mask wraps around every edge. Rebuilding from settings creates a fresh procedural mask.
PATCH SYNTHESIS & HEALINGPatch size 16, 32, 48 (default), 64, 96. Patch search quality: Fast · 12 candidates, Balanced · 32 candidates (default), Detailed · 64 candidates. Synthesize new patch arrangement rearranges source patches with overlap matching and minimum-error cuts to reduce repetition. Seam healing width 2–64 (default 16) with Heal boundary seams. Undo synthesis / healing, Cancel processing. Runs in a background worker.
MATERIAL OUTPUTAn edge check verifies continuity. Use as terrain material → Dimensionner XC2 sends the result to the terrain tool.

Export material maps ZIP saves seamless-material-maps.zip with color.png, the blend mask, height, normal and roughness PNGs and settings.json. Height and normal maps are derived from image brightness. For lit sprite maps with finer control, use Sprite lighting.

Terrain sculpting

07 Dimensionner XC2 generates and sculpts a terrain mesh with independent vertex channels: tint, shading, texture/foliage blend and opacity are stored in four separate RGBA attributes (_Color to _Color4), and the mesh carries two UV sets. Header buttons: Save terrain, Open terrain, Export Godot + Blender bundle, View PNG.

Generate a landscape

  • Terrain shape: Rolling hills, Mountain ridges, Island, Desert dunes, Canyon, River valley, Terraced plateau, Flat ground.
  • Seed 0–999999 (default 73) with Randomize; Grid detail 16, 32, 48 (default), 64, 96, 128; Width and Depth 2–200 (default 24); Height range 0–30 (default 4).
  • Generate terrain replaces the current terrain (save first to keep it). Thermal erosion · 8 passes applies eight erosion passes.
  • Import heightmap converts an image into editable terrain. Import OBJ mesh with UVs keeps the OBJ's UVs and adds a planar overlay UV set; imported meshes support vertex painting and sculpting. Load UV-seam / leaf-litter demo shows an overlay bridging ground sections with different UV orientation.

Brush

ControlOptions and range
ActionOrbit / inspect, Raise terrain, Lower terrain, Smooth terrain, Flatten to height, Paint vertex color, Paint vertex shading, Paint texture / foliage blend, Paint opacity, Paint custom attribute, Paint material C, Paint material D, Paint roughness, Place path points.
Radius (world units)0.1–12, default 2.
Strength1–100, default 30.
Tint colour, Channel valueColour for vertex tint; value 0–1 (default 1) for scalar channels.
Flatten height−100 to 100, default 0.
Custom attribute, Custom component_Color · tint RGBA, _Color2 · shading RGBA, _Color3 · blend RGBA, _Color4 · opacity RGBA; component R, G, B, A or RGBA from color + value.
Fill selected paint channelFills the whole channel with the current value.

Drag to paint. Shift reverses raise/lower or the scalar paint target. Alt-drag or middle-drag orbits, right-drag pans, scroll zooms. Roughness is stored in the green component of _Color2.

Terrain workbench and materials

  • ↶ Undo, ↷ Redo, Reset camera, Wireframe, PSX preview, Directional light (on).
  • Channel preview: Final material, Vertex color, Shading mask, Blend mask, Opacity mask, UV set 1, UV set 2, Painted roughness.
  • BASE & OVERLAY: Base surface and Material B / foliage (library or uploaded textures), Show material overlay, Base UV repeat and Overlay UV repeat (0.1–64, default 8), Base UV rotation and Overlay UV rotation (−180 to 180), Overlay offset U/V (−8 to 8). Paint overlay along UV seams, Clear material B mask, Blend B by terrain slope. The overlay uses UV set 2.
  • MORE PAINTED MATERIALS: Material C · blend green and Material D · blend blue (with uploads), revealed by Paint material C/D. All overlays use UV set 2.

Roads, rivers and foliage

Roads & rivers

Choose Road · flatten and paint C or River · carve and paint D, set Path half-width (0.1–20, default 1.5) and River depth (0–20, default 0.8), press Place path points on terrain and click at least two points. Apply path builds it: roads follow the height profile of their points and paint material C; rivers carve below it and paint material D. Clear draft points discards unapplied points; terrain Undo restores an applied path.

Foliage scatter

Set Plant count (1–2000, default 300), Scatter seed (default 37), Plant height (0.05–5, default 0.5) and Minimum upward normal (0–100, default 65), then press Scatter grass clumps. Placement is seeded and area-weighted and avoids steep faces. Plants export as geometry. Re-scatter after sculpting; Remove scattered foliage clears them.

Baking and terrain export

GEOMETRY BAKING & GLB projects the highest mesh surface onto the X/Z plane. Choose Bake resolution (128, 256 default, 512, 1024) and press Bake maps from terrain geometry. Preview: Material color, Geometric height, Geometry normal, Horizon ambient occlusion, Painted roughness, Curvature. Height, normals, curvature and AO come from geometry; roughness comes from vertex paint. Export baked maps ZIP saves the maps with bake-info.json.

Terrain chunks: Single terrain, 2 × 2 chunks, 4 × 4 chunks or 8 × 8 chunks, with Show chunk guide. Export terrain + foliage GLB saves dimensionner-terrain.glb; Export separate chunks ZIP saves one GLB per chunk and chunks.json (chunks keep world coordinates, so place them all at the origin). Cancel processing stops a running job.

ButtonOutput
Save terrain / Open terraindimensionner-xc2.json: editable geometry, materials, paths and foliage.
Heightmap PNGxc2-heightmap.png.
Vertex masks PNG + data ZIPxc2-vertex-masks.zip.
Export Godot + Blender bundledimensionner-xc2-engine-bundle.zip: base.png, overlay.png, layer-c.png, layer-d.png, terrain.mesh.json, foliage.mesh.json, vertex-data.json (two UV sets, all sixteen vertex data components), terrain-layout.json, a ready-to-open Godot scene terrain.tscn with terrain.gd and terrain.gdshader, and a Blender import script import_blender.py.
View PNGdimensionner-xc2.png of the current view.

Image restyling

The 09 Image Cloner (titled Cloner) keeps an image's composition and changes its rendering style with local image filters. Header buttons: Open images, Restyle image, Download clean PNG, Restyle queue → ZIP.

  • SOURCE & QUEUE: drop, paste or open images, or Use active library texture. Images are processed one at a time with no fixed queue limit; Clear queue empties it.
  • STYLE: Style preset — Original / metadata only, PSX pixel art, Pencil sketch, Watercolor (default), Oil painting, Screen print, Comic book, Blueprint, Duotone poster, Analog film. Style strength 0–100 % (default 85 %), Detail 1–100 (default 60), Surface texture 0–100 % (default 15 %), Variation seed with New variation, Reset style controls.
  • OUTPUT SIZE: Resolution (long edge) — Original dimensions, 16 to 8192 pixels, or Custom dimensions (Width, Height, Keep source proportions). Preserve transparency (on). The whole image stays in frame.
  • BEFORE / AFTER shows source and result; long jobs show progress with Stop.
  • CLEAN EXPORT & HANDOFF: Use neutral filenames for downloads (on) names files image-001 and so on instead of the source name. Open result in PSX Converter, Add result to texture library.

PNG and ZIP exports rebuild the pixels and remove embedded EXIF, GPS, comments, software tags and other optional PNG metadata. Use Original / metadata only to clean an image without restyling. Visible text and watermarks remain.

Pixel 2 Pixel

10 Pixel 2 Pixel turns blocky pixel art into smooth, clean illustrations by smoothing the shapes and colours already in the artwork; it does not invent photographic detail. Header buttons: Open images, Clean & upscale, Download clean PNG, Download SVG, Clean queue → ZIP.

Source, reconstruction and size

  • SOURCE: Use library texture, Try pixel-art sample, an image queue and Clear queue.
  • RECONSTRUCTION: Look — Clean illustration (default), Rounded shapes, Crisp detail, Soft illustration, Original pixels (nearest-neighbour reference). Edge smoothing (default 65), Noise cleanup (default 15), Detail definition (default 20), Reset look controls, Compare all looks (a thumbnail gallery that renders each look with your current settings). Source pixel block size: 0 detects automatically, 1 for original pixel art, 4 if each pixel was enlarged to a 4 × 4 block.
  • SIZE & TRANSPARENCY: Output size 2×, 4× (default), 8× source size, Original dimensions or Custom dimensions; Keep source proportions; Preserve transparency (on); Background when transparency is off.
  • INSPECT THE EDGES: View (Before / after with a divider, Original, Cleaned result), Zoom (Fit, 100 %, 200 %, 400 %) and Preview background (Checkerboard, Light, Dark).

Cleanup, palettes and recipes

  • BACKGROUND & EDGE CLEANUP: Remove background, Detect color from image border (on) or a Background color, Color tolerance (default 18), Edge feathering (default 20), Remove edge color fringe (default 40), Only background connected to border (on).
  • MATCH A PALETTE: Match output to this palette, Color matching strength (default 100), editable swatches (Add color, Clear colors, × removes one), Colors to extract 2–64 (default 16), and palette sources From source, From library, Reference image, Shared game palette, Import palette JSON, Save palette JSON.
  • REUSABLE BATCH RECIPES: Recipe name, Save current recipe, Apply recipe, Delete recipe, Export current JSON, Import recipe JSON, and Reuse image masks across batch (stretches the current masks to each image). Recipes store cleanup, size, palette and export settings.
  • Correction brush & selective cleanup: Brush — Off · inspect image, Protect from cleanup (blue), Apply cleanup again, Erase background (red), Restore original foreground (green), Clear background corrections; Size (source pixels) 1–2048 (default 8); Edge Soft/Hard; Show mask; Undo brush, Redo brush, Clear masks. Paint on the preview, then Clean & upscale. Pen, mouse and touch work.

Export formats

  • EXPORT FORMATS & SMOOTH SVG: Format — PNG · lossless transparency, JPEG · smaller photos, WebP · compact transparency (default), SVG · selected vector mode, SVG · smooth traced curves. JPEG / WebP quality 1–100 (default 90), Target file size (KB, 0 = no target) (searches quality without resizing), JPEG background.
  • SVG mode for Download SVG: Exact colored pixel shapes or Smooth curved outlines, with Trace palette colors (2–64, default 16), Trace detail (default 65), Corner smoothness (default 60) and Ignore alpha below (default 8). Tracing approximates the image with editable curved paths and keeps transparent holes.
  • Preview export & size opens a preview with the file size and Download this file; Download selected format saves directly.
  • EXPORT & CONTINUE: Use neutral filenames, Batch ZIP format (PNG images, SVG vector shapes, JPEG images, WebP images, SVG smooth curves), Add to texture library, Open in PSX Converter.

PNG, SVG and batch ZIP outputs omit embedded source metadata. Detailed images and gradients can create large SVG files.

Sprite extraction

11 Sprite Extractor splits a sprite sheet into individual sprites without resampling, smoothing or palette conversion. Use Open sprite sheet (or drop, paste, or Use library texture), then Extract sprites.

SettingOptions and defaults
Extraction methodRegular grid or Separate shapes by transparency.
GridCell width, Cell height (default 32), Left margin / origin X, Top margin / origin Y, Horizontal gap, Vertical gap (default 0), Include partial cells at right / bottom (off).
ShapesConnected pixels: Touching edges or corners (8-connected) or Touching edges only (4-connected). Every connected shape becomes a sprite, including one-pixel details; use the grid to keep disconnected parts together.
TRIM & TRANSPARENCYTrim transparent margins (on), Skip empty grid cells (on), Transparent output padding (default 0), Transparency threshold (0–254) (default 0; pixels at or below become transparent, others keep their colour and opacity).

The sheet preview draws the crop boxes; click a box to select its sprite, or step with ← and →. Download selected PNG saves one sprite; Open in Pixel 2 Pixel sends it on; Download sprites ZIP saves numbered PNGs and a manifest with the original rectangles, trim offsets and output sizes. Small and duplicate sprites are kept.

Tip. To turn a sheet into a multi-frame sprite project, use the sprite-sheet import of Pixel & animation or the io_import_sheet tool.

Library and history

08 Library & History organizes project textures and keeps recoverable versions. Header buttons: Export portable project (the same as the Texture Editor's Save project) and Refresh history.

  • ORGANIZE TEXTURES: Search names, folders or tags, Folder filter, Favorites only. For the active texture, set Folder path (up to 120 characters, for example Environment / Buildings), Custom tags · comma separated (up to 24 tags of 40 characters) and Favorite texture, then Save texture details. Open active texture in editor switches to the Texture Editor.
  • Find exact duplicate artwork compares pixel content exactly and labels duplicate groups; layers are not changed.
  • PROJECT TEXTURES shows the filtered library as cards.
  • NAMED SNAPSHOT: type a name and press Save named version. The last 20 automatic versions are kept; named versions stay until you delete them. Request durable local storage asks the app's storage not to evict local data; the panel shows storage use.
  • PROJECT VERSION HISTORY: each version has Restore project, Recover texture copy (adds the chosen texture as a new library item), Restore timeline (animation timeline and soundtrack), Download version and Delete version. Restoring first saves a safety snapshot.
Note. The tab also shows SAVED SEARCHES and OFFLINE DOWNLOADS panels. Isberg Labs has no online texture provider, so these panels stay empty; use Local assets to find images.

Projects, storage and image privacy

  • Isberg project. Saving the Isberg project (.isberg) stores the complete Texture Studio project, including all tabs that have state (animation timeline, terrain, seamless settings, library metadata and so on).
  • Portable project file. Save project exports psx-texture-studio.json with every texture, cached frame and audio clip embedded, so it can be opened on another computer.
  • Local storage. Recovery copies, automatic and named versions are kept in the app's local storage on this computer. They are not part of the portable project file and are lost if that data is cleared.
  • Metadata stripping. PNGs written by the converter, editor exports, atlases, sprite sheets, Image Cloner, Pixel 2 Pixel and Sprite Extractor keep only the image chunks needed to show the pixels and transparency (IHDR, PLTE, tRNS, IDAT, IEND). Text, time, colour-profile and other ancillary chunks are dropped.

Import and export formats

FormatImportExportWhere
PNG, JPEG, WebP, GIF, BMP, AVIF and other decodable imagesYesPNG everywhere; JPEG and WebP in Pixel 2 PixelAll tabs
PlayStation TIM (.tim)NoYes (4-bit, 8-bit, 16-bit)PSX Converter
SVGConverter source onlyPixel 2 Pixel (exact shapes or traced curves)Converter, Pixel 2 Pixel
OBJTexture Editor (under 12 MB), Dimensionner XC2OBJ + MTL + textures ZIPTexture Editor, Advanced Studio
glTF binary (.glb)NoTextured scene; terrain and foliage; per-chunk GLBsAdvanced Studio, Dimensionner XC2
Video (MP4, MOV, WebM and others)YesWebM, MP4 with audio, animated GIFTextures Animator
AudioSoundtrack from audio or video filesInside MP4/WebMTextures Animator
Godot scene and shader, Blender scriptNoEngine bundle ZIPDimensionner XC2
JSON documentsProject, animation, terrain, settings, palette, recipeSameVarious
ZIPNoBatches, sprite sheets, atlases, material maps, bakes, chunksVarious

MCP tools

Textures & terrain has no tool group of its own. Drive it with the generic workspace tools, using the workspace ID texture:

Related image tools that work on files directly: texture_fill (procedural noise, Voronoi, dither and gradient fills), texture_scatter (seeded scatter of tufts, pebbles and other small parts), video_to_pixel (video to a palette-shared pixel animation) and palette_from_reference. See MCP and the tool reference.

Troubleshooting

Save .TIM (PS1 binary) is disabled
The texture is wider or taller than TIM allows (65,535 words or rows) or no conversion is available. The message under the button explains which; export PNG or choose smaller dimensions.
“Preview could not be drawn at this zoom”
The zoomed preview exceeds the canvas size the engine can allocate. Choose Fit; full-resolution exports still work.
“The library is full. Remove a texture first.”
The Texture Editor library holds 64 textures. Remove or merge textures before importing, duplicating or creating more.
“Use an OBJ file smaller than 12 MB.”
Reduce the model or split it before importing into the Texture Editor.
3D rendering is unavailable
WebGL could not start or was interrupted. Your pixel artwork is still available; save the project before reloading.
Painting on a layer does nothing
In the Advanced Studio, show the layer and raise its opacity above zero.
“No split UV boundaries were detected.”
Paint overlay along UV seams needs a mesh with UV seams. Load the seam demo or import an OBJ that has them.
Recovery could not be saved
Local storage is full or unavailable. Use Save project to keep a portable copy, and consider Request durable local storage.

Sprite lighting

Sprite lighting builds normal, height, specular, ambient-occlusion and parallax (depth) maps from a 2D sprite and previews it under up to 32 coloured lights. Use it to give flat sprites and tiles dynamic lighting in your engine. Its panel is titled Surface & light.

Getting started

  1. Press Import image. If an image is selected on the project asset shelf, that image is used; otherwise a file dialog opens. Demo loads a built-in brick disc.
  2. Choose a Processing profile (see Processing profiles) and adjust the map controls in the sidebar. Every change regenerates the maps.
  3. Switch the view with the tabs above the preview: Lighting, Source, Normal, Height, Specular, Occlusion, Parallax.
  4. On the Lighting view, drag across the preview to move the selected light.
  5. Export with Export displayed PNG (surface-<view>.png), Export all maps (surface-normal.png, surface-height.png, surface-specular.png, surface-occlusion.png, surface-parallax.png, one save dialog each) or Send displayed map to assets (adds it to the project asset shelf).

The line under the preview shows the image size, the current view and which renderer drew the preview.

Processing profiles

ProfileUse it for
Calibrated controls (default)Integer, native-unit controls with the image-processing order defined by the public Laigter 1.14.0 source: recursive blurs, exact Euclidean distance for bevels and occlusion, and the same derivative and composition rules. Required for custom bases, the 3×3 neighbour atlas, the native sheet grid, paint overlays and Laigter preset/project interchange.
Custom controlsThe independent Isberg workbench with continuous sliders (Sobel normals, Gaussian smoothing, chamfer distance and a horizon occlusion estimate).

Saved editor states from before the profile existed reopen with Custom controls, so their maps stay the same.

Limits. The calibrated profile is an independent implementation written from the published source formulas. It has not been compared against output from the original application, so byte-identical maps are not claimed; differences near byte boundaries, in the original's GPU preview and in Qt image-format paths remain possible.

Calibrated map controls

The Source-defined map controls section appears when Calibrated controls is selected. All numeric fields are whole numbers in the original's slider units.

ControlRangeDefault
Detail height0–4000250
Detail softness0–406
Edge height0–4000100
Edge distance0–25560
Edge softness0–4010
Rounded bevelon/offon
Tile neighborhoodon/offoff
Invert normal X, Invert normal Yon/offoff
Depth modebinary, height, quantization, intervalsbinary
Depth threshold0–255140
Depth focus0–502
Depth softness0–503
Binary minimum height0–2550
Binary dilation / erosion−99 to 991
Height depth brightness−255 to 2550
Height depth contrast ×10001–40001000
Invert depthon/offoff
Quantization (source pass-through)1–2551
Specular softness0–503
Specular brightness−255 to 2550
Specular contrast ×10001–40001000
Specular pivot0–255127
Invert specularon/offoff
Occlusion softness0–503
Occlusion brightness−255 to 25516
Invert occlusion sourceon/offoff
Occlusion threshold / pivot0–2551
Occlusion contrast ×10001–40001000
Occlusion distance0–102410
Occlusion distance modeon/offon
Normal alpha option, Specular alpha option, Occlusion alpha option, Depth alpha optionon/offoff
Alpha output behaviorReference byte layout, Preserve transparencyReference byte layout
  • Depth mode quantization and intervals pass the grayscale through unchanged, as in the reference source; their stored settings are kept.
  • Reference byte layout reproduces how the original writes source alpha into map rows. Preserve transparency instead puts the source alpha into each map's alpha channel, which is usually what a game engine expects.

Custom map controls

These controls appear when Custom controls is selected.

GroupControlRangeDefault
GeneralGrayscale conversionperceptual, integerperceptual
Byte quantizationround, truncateround
Preserve source alphaon/offon
Inner detailsNormal strength0–204
Smoothing radius0–61
Height contrast0.1–41
Height gamma0.1–41
Occlusion radius1–328
Occlusion strength0–82
Specular strength0–20.6
Specular contrast0.1–51.5
Invert normal X, Invert normal Y, Invert height, Seamless edges, Height from transparencyon/offoff
Silhouette bevelEdge height0–200
Edge distance1–648
Edge softness0–60
Edge profilespherical, linearspherical
Specular tuningBrightness−1 to 10
Threshold0–10.5
Softness0–60
Invert specularon/offoff
Independent depth mapDepth sourceheight, binaryheight
Binary threshold0–10.5
Focus0–60
Depth softness0–60
Minimum depth0–10
Dilate / erode−8 to 80
Depth brightness−1 to 10
Depth contrast0–51
Invert depthon/offoff
Occlusion tuningOcclusion modehorizon, grayscale, distancehorizon
Darkness spread1–648
Occlusion brightness−1 to 10
Occlusion contrast0–51
Occlusion threshold0–10.5
Occlusion softness0–60
Invert occlusionon/offoff

The silhouette bevel works even when the inner-detail strength is zero. Depth-map settings do not change the normal map.

Custom bases and preview maps

  • Set height source and Set specular source replace the grayscale that the calibrated profile derives from the sprite with an image of your own. Set 3×3 neighbors supplies a neighbour atlas so tiled normals continue across tile edges. Clear custom sources removes all three. Like Import image, these buttons take the selected asset or open a file dialog.
  • Preview normal image, Preview specular image, Preview occlusion image and Preview parallax image replace that generated map with a finished map of your own, for example one painted elsewhere. The image must have the same size as the source. The replacement is also what Export all maps writes until you press Clear preview images.

Sprite sheets

Sprite-sheet isolation

Tick Process each cell separately to compute normals, blurs and distances inside each cell, so neighbouring sprites do not bleed into each other's maps. Set frameWidth and frameHeight (default 32, minimum 1), offsetX, offsetY, gapX and gapY (default 0). Only complete cells are processed; spacing and incomplete edge cells stay transparent. Up to 4,096 cells.

Per-frame overrides go in the text box as JSON keyed by zero-based frame index, then Apply per-frame settings:

{"1":{"bumpHeight":4},"2":{"specularBrightness":0.2}}

Native sheet grid

Columns and Rows (1–256) describe a frame grid for the calibrated profile and material projects. They must divide the image size exactly. Setting them clears any custom neighbour atlas.

Paint overlays

With Calibrated controls selected, you can paint corrections on top of any map:

  1. Switch to the map tab you want to correct: Source (diffuse colour), Normal, Height, Specular, Occlusion or Parallax. The Lighting view cannot be painted.
  2. Tick Paint displayed map, pick a colour (default #8080ff, a flat normal), and set Brush radius (1–64, default 4) and Brush opacity (0.01–1, default 1). Tick Erase overlay to remove paint instead.
  3. Drag on the preview. Undo paint, Redo paint and Clear displayed overlay manage the strokes.

Height paint changes the normal detail. Source paint changes the lit and source preview without changing the height base. Overlays are saved in material projects and editor state. The undo depth is up to 30 strokes, fewer for very large images.

Preview lights

The Preview light section edits the selected light. Choose a light in the list, Add light (up to 32) or Remove (one light must remain). Preview settings never change the generated maps.

ControlRangeDefault
PositionDrag on the Lighting view—
Light height−128 to 1280.6
Intensity0–41
Specular intensity0–41
Shininess1–12824
Light color, Specular light colorColourWhite
Animate selected light, Light angular speedon/off; −8 to 8off; 1
Ambient, Ambient color0–1; colour0.25; white
Preview backgroundColour#141b25
Preview parallax0–0.30
Map / source blend0–10
Toon preview, Toon levelson/off; 2–8off; 3
Pixelated previewon/offon

Lighting mathematics and renderer

  • Lighting mathematics: Source-defined Phong / toon (default) follows the reference shader: up to 32 independently coloured diffuse and specular lights, reflection-vector highlights, occlusion applied to ambient light only, toon thresholds, and 10-to-100-layer parallax. Independent studio lighting is the Isberg CPU preview and uses the first 16 lights.
  • Preview computation: GPU runs a local WebGL shader; CPU computes the same equations in software. If the GPU renderer cannot start, the CPU is used and the info line says so.
  • Animated lights advance in fixed 1/60-second steps and run only with source-defined lighting.
  • The JSON box shows the complete source light and viewport settings (lights, rotation, zoom, camera, repeat, alpha). Edit it and press Apply source lighting settings, or press Source preview defaults.
  • Source preview session keeps the previous light uniforms when an update has zero lights, as the reference controller does; Reset preview session clears that state.

Material projects and presets

Presets

Import preset reads an Isberg preset (.isbpreset, legacy .gbpreset) or a Laigter text preset (.preset, .presets, .txt, starting with [Laigter Preset], under 1 MB). All 34 recognized settings and the coloured light records are applied; unknown lines are kept. Export preset saves surface.isbpreset, a JSON document that also keeps the lights and unknown lines.

Material projects

A material project holds one or more surfaces, each with its own image, calibrated settings, custom bases, overlays, lights and metadata.

  • Open material project reads .isbmaterial (legacy .gbmaterial) or a Laigter project archive (.zip, .laigter; stored or deflated, up to 128 MB). Imported archives keep processor images, custom bases, overlays, frame and animation metadata, general settings and unknown entries.
  • Export .isbmaterial saves surface.isbmaterial with everything embedded. Unchanged imported PNGs are written back byte for byte.
  • Add surface (takes the selected asset or opens a file dialog), Duplicate surface and Remove surface manage surfaces, up to 128; one must remain. The surface list appears once a project exists. Surface name renames the current surface; names must be unique.
  • The two JSON boxes hold the native general project settings and the current surface's metadata. Edit them and press Apply project metadata. Apply native project preview applies the project's stored preview settings (ambient, blend, view mode, toon, pixelation and lights).
Limits. Laigter presets and projects are import-only; Isberg writes .isbpreset and .isbmaterial. When a native project is loaded, the sample diffuse colour is applied to both diffuse and specular light, as the original loader does; the stored specular colour is kept in metadata.

Formats

FormatImportExport
Source imageImage file or selected project asset, up to 16 megapixels—
Map PNGs (normal, height, specular, occlusion, parallax, lit preview)As custom bases or preview mapsYes
.isbpreset / .gbpresetYes.isbpreset
Laigter preset textYesNo
.isbmaterial / .gbmaterialYes.isbmaterial
Laigter project ZIPYesNo

MCP tools

  • surface_generate — generate all five maps with the custom control groups, optionally per sprite-sheet cell.
  • surface_preview — render independent studio lighting (up to 16 lights, ambient tint, toon, parallax) to PNG.
  • surface_calibration — describe the calibrated controls, units, defaults and evidence limits.
  • surface_calibrated — generate calibrated maps with custom bases, 3×3 neighbours and overlays.
  • surface_preset — read Laigter or Isberg presets; write .isbpreset.
  • surface_project — create, import, export, inspect, update and regenerate material projects.
  • surface_project_state — edit project and surface metadata, lights and frame grids; add, duplicate, move or remove surfaces.
  • surface_reference_preview — render source-defined Phong/toon/parallax lighting on CPU or GPU.
  • surface_preview_session — keep and replay retained preview uniform state.
  • surface_light_frames — advance animated lights by an exact number of 1/60-second ticks.
  • surface_pixels — decode, encode and resize images with explicit native byte layouts.
  • material_generate / material_render — earlier map generation and 16-light rendering calls, kept for existing scripts.

The editor itself is workspace ID materials for workspace_commands, workspace_execute and studio_workspace_state. A game style applied with workspace_game_preset_apply switches to custom controls and sets map strength, lighting and toon options.

Troubleshooting

“Expected a local RGBA image under 16 megapixels.”
The source is too large. Scale it down or split the sheet.
“Choose calibrated controls to edit map overlays.”
Overlays exist only in the calibrated profile. Switch Processing profile to Calibrated controls.
“Preview map dimensions must match the source.”
A preview map must be exactly the size of the source image.
“Native sheet columns/rows must divide the image dimensions.”
Use column and row counts that divide the width and height exactly.
“The preset header is not recognized.”
The file is not a Laigter preset or an Isberg .isbpreset.
An older project looks different after switching profile
States saved before profiles existed open with Custom controls. Switching to Calibrated controls uses different controls and produces different maps.
Lights do not animate
Animation runs only with Lighting mathematics set to Source-defined Phong / toon.

World builder

World builder holds four procedural map editors in one workspace: Town Generator for street plans, PSX Builder for low-poly modular buildings and districts, Terrain Studio for sculpted landscapes and illustrated map sheets, and Floor Plan Designer for multi-level building charts. Each editor is seeded and repeatable, keeps its full editable state, and exports images, models or JSON for your game.

Workspace layout

The tabs Town Generator 01, PSX Builder 02, Terrain Studio 03 and Floor Plan Designer 04 switch editors. An editor loads the first time you open its tab and keeps its work while you use the others.

ControlShortcutAction
Find a controlCtrl+KSearches the four editors and every visible button, field and setting in the current editor. ↑/↓ move, Enter opens: the control is scrolled into view, its section opened and the control highlighted.
TabsAlt+1–4Switch to editor 1–4. Arrow keys, Home and End also move between focused tabs.
Hide panels / Show panelsAlt+FHides the current editor's settings to enlarge the canvas.
Quick guide—Four getting-started steps for the current editor.
Export—Menu of the current editor's exports; unavailable entries are disabled. See Editable state and exports.
Fullscreen—Enters or leaves fullscreen.
—EscCloses the export menu or the quick guide.

Game styles and seeds

The bar under the header applies a game-style starting map to the active editor.

  1. Choose a Game style: Retro platformer, Fantasy RPG, Dungeon crawler, Sci-fi shooter, Survival horror, Stealth, Cozy simulation, Strategy / tactics, Racing or Puzzle / adventure.
  2. Enter a Seed (default gamebench-1, up to 128 characters).
  3. Press Generate game preset. The active editor's map is replaced; the other editors keep their work.
  4. Undo preset restores the previous map, including its edited state.
  • Town recipes set the layout, street density, curvature and width, connectivity, terrain, water, vegetation and sheet presentation.
  • Building recipes set the district type, zoning, architecture, density, wear, lighting and streets.
  • Floor-plan recipes set dimensions, footprint, floors and basements, difficulty, encounters, resources, doors and room names; Cozy simulation turns combat encounters off.
  • Terrain recipes generate distinct terraces, valleys, craters, arenas, marshes, compounds, meadows, tactical terrain, circuits or islands on a 2-metre height grid with graded starter roads; Racing includes a closed route and Strategy / tactics has opposing approaches and objective labels.

The same seed, recipe and map size always produce the same terrain. Save editable world and Open editable world are described in Editable state and exports. The shared game-style control in the studio uses the same operation; see Game presets.

Limits. Presets are editable starting layouts, not game rules. Strategy labels do not implement teams, navigation or scoring, and generated props are not checked for collisions or encounter balance. Raster textures are not guaranteed to be pixel-identical across graphics drivers.

Town Generator

Town Generator draws procedural street plans with placeholder buildings, as a flat map sheet or a 3D model. Everything redraws on change; the same seed with the same settings gives the same map.

Layout and actions

  • Layout logic: Realistic · Grown town (natural streets, connected neighbourhoods), Realistic · Planned grid (orderly blocks, buildings facing roads) or Classic procedural (the original generator).
  • Generate map, New seed, Save PNG.
  • Copy setup copies all settings as JSON; Paste setup reads JSON from the clipboard or a prompt. Save setup writes <town-name>.isberg-town.json; Open setup restores it (files up to 2 MB; every value is validated before anything changes).
  • Starting points: Foggy lake town, Cut-off hamlet, Mountain valley, Forest logging town, Farmland crossroads, Dense city, River trading town, Harbour town.

Settings

SectionControls (defaults)
MapTown name (Lakehaven), Seed (ashfield), Size (Small — 1100 × 800, Medium — 1600 × 1100 default, Large — 2100 × 1450, Huge — 2600 × 1800), PNG export resolution (1× — screen size, 2× — print default, 3× — poster), Fit map to window, View (Flat sheet or 3D model).
3D modelTerrain height 40–300 (130), Building height 50–300 (150), Sun direction 0–359 (220), Sun height 8–85 (38), Shadows, Roofs, Trees, Labels, Haze, Reset camera. Drag orbits, scroll zooms, right-drag pans; Save PNG captures the 3D view.
SettlementType (Rural, Small town default, Normal city, Dense city), Rural pattern (Grid town — old lakeside streets, Scattered homesteads, Company / mining town, Crossroads hamlet), Isolation (35), Road density (55), Block size (50), Building coverage (65), Building size (45), Parks (30), all 0–100; Outlying clusters 0–5 (1).
StreetsMain roads through town 0–4 (2), Main road route (Follow the street grid, Cut across the country), Grid regularity (70), Road curviness (35), Grid rotation — automatic with Angle 0–89, Dead-end streets (25), Alleys (45), Alley width 2–8 (4), Road width 60–150 (100).
RegionSetting (Lake shore default, Mountain valley, Deep forest, Plains & farmland, Coast), Dry map — no lake or river, Water (55), Tree cover (55), Terrain relief (45), River, Bridges over water.
SheetStyle (Fog map — worn paper default, Atlas — clean print, Survey — sepia ink, Blueprint, Night watch), Building labels (None, Numbers, Shop & use names), Reference grid (None, Border only, Border and grid lines), Label size 70–150 (100), Highlight main roads, Street names, Landmarks, Title card, Legend, Compass, Paper grain.
ColoursMain road, Street, Alley, Building, Landmark, Block, Water, Land, Trees, Park, Frame, Ink; Reset colours to style.

Keys: G generate, N new seed, S save PNG.

PSX Builder

PSX Builder generates modular low-poly buildings with a retro look, from a single house to a district of blocks, and exports them as OBJ + MTL.

Scene and town plan

  • Scene: Single building, One street, One city block, District — grid of blocks.
  • Town scenes: District type (Mixed small town, Downtown / main street, Residential, Industrial park, Lakeside resort, Rural edge, Hospital district), Street plan seed with Re-roll roads, 🎲 Random road layout (everything below).
  • Districts: Blocks across 1–8 (3), Blocks down 1–6 (2), Block width (m) and Block depth (m) 20–240 (70 and 50), Road width 5–18 m (9), Road curve 0–100 % (30).
  • Packing (from density, loose, tight, row), Zoning (by street type, commercial core, shops on main roads only, old town, suburb, industrial belt, boardwalk, derelict, no zoning), Landmarks (hospital, school, big apartment block, church, town hall / courthouse, hotel, factory, mall / supermarket, police & fire, amusement park, sanatorium, prison, subway entrance, motel, special block), Attached rows, Parked cars.
  • Town layout presets with Apply (prepared town layouts such as a foggy lakeside resort town or a 1960s roadside strip), Building density (65 %), Open lots — parks, parking, vacant (20 %), Water edge (none, east, west, north, south), rail spur, parked cars, show plan map, District shape (rectangle, rounded, irregular / coastline), Hills.
  • Street pattern: diagonal avenue, park loop, dead ends / T-junctions, cul-de-sacs, parking lots, street furniture, poles & wires, street name signs, corner buildings.
  • On the plan map, click a lot to cycle it (built → park → parking → vacant → campus) and click a street to remove or restore it.
  • Draw on the ground: Road, Alley, Sidewalk / path, Hole / chasm, Crack (line), Chain-link fence, Concrete barrier, Rail track, Flooded area, Grass / overgrown patch, Debris field, Roadblock (single click). Press Start, click the ground to add points, double-click or Enter to finish, right-click undoes a point. The toolbar over the 3D view chooses the road type (asphalt street, wide avenue, one-lane paved, dirt / gravel, cobblestone, boardwalk), hole type, roadblock type and snap to streets, with ✔ Finish, ↶ Undo, ✕ Points and Exit. Clear everything drawn on this plan removes drawings.

Building settings

  • Building type, Setting / era (for example Small town (default), Post-war 1950s, Soviet bloc, Victorian / 1900, Old West frontier, Alpine / mountain, Abandoned / after the fall), Palette, Windows, Height, Signs, Seed (⟳ for a new one).
  • Footprint: Rectangle, L-shape, T-shape, U-shape, Cross, Hexagon, Octagon or Draw on the ground… (corner by corner, box in two clicks, or edit corners; Finish, Undo, Clear, Mirror ↔, Rotate 90°, Center; Snap off/0.5/1/2 m; open path, auto-close, right angles only, live preview, show lengths). Keys while drawing: Enter finish, Backspace undo, Esc clear.
  • Stories (auto or a number), Width and Depth (0 = auto), Walls, Roof, Trim, Decay 0–100 % (40).
  • Modules: chimneys, roof units, pipes, signs, balconies, grime, props, night, hollow interior, remove roof, rooms & stairs, interior lights, trim & sills, damage, overgrowth, posters / graffiti, window grilles.
  • Render (crunchy 1/4, PSX 1/3 default, half, native), Fog 15–700 m (70), vertex wobble; Neighbours (single building) and Alley.
  • Generate, Export .obj + .mtl, Save screenshot; in town scenes also Export map (SVG) and Export map (PNG).

Navigation: drag orbits; right-drag, Shift-drag or Ctrl-drag pans; wheel zooms (Ctrl for fast); WASD or arrows move, Q/E rotate, R/F tilt, PgUp/PgDn zoom, Home reframes.

Terrain Studio

Terrain Studio (the Overpass road and terrain editor) combines terrain sculpting, roads, props, labels and illustrated map sheets in one scene measured in metres.

Top bar

  • View: Build, Map sheet, 360. Camera: PERSP, ORTHO, TOP. UNDO, REDO.
  • Toggles: GRID, CONTOUR, FOG, PSX, WATER, SHADOW.
  • New (empty sheet), Save (<title>.overpass.json), Open, Snapshot (PNG of the 3D view), ? (keyboard and mouse help). The view dial resets to north with N↑.

Tools

GroupTool (key)Use
SculptRaise (1), Lower (2), Smooth (3), Level (4), Ground (5)Drag to sculpt; Shift inverts raise/lower; digging below the water line opens a lake. Level takes its target height from the first click. Ground paints Grass, Meadow, Dirt, Gravel, Asphalt, Sand or Water; water can sink its own channel (Depth 0.2–4 m).
RoadsRoad (R)Click control points; right-click or Enter finishes, Backspace removes the last point, Esc cancels. Types: Highway, Street, Lane, Dirt road, Trail, Railway.
ObjectsSelect (V), Place (P), Scatter (F)43 objects in Buildings, Derelict, Fences, Infrastructure, Nature and Street. Shift aligns a placed object to the nearest road; fences and barriers drag out as a run. Select drags to move, Shift-drag turns; D duplicates and Delete removes. Scatter avoids roads and water.
AirFog (G)Paints ground fog, smoke or gas.
NotesArrow (A), Circle (C), Label (L)Map mark-up: click start and end for arrows, drag from the centre for circles, click to write a label.
EditMeasure (M), Erase (X), Look (Q)Measure reports plan distance, surface length, rise, average grade and steepest grade. Erase removes anything under the brush, with filters. Look orbits only.

The inspector has Tool, View and World tabs. Brush Radius is 2–44 m; Strength 0.05–1.6 for sculpting; Density for scatter. [ and ] change the brush size; Ctrl+Z / Ctrl+Shift+Z undo and redo. The View tab sets navigation (zoom towards the cursor, invert zoom, speed, turntable) and the Look: Clean or PSX rendering with Pixel size 2–8, ground texture (Flat, Grain, Speckle, Gravel) and map sheet style. The World tab sets the Map size (Width and Depth 96–448 m in 32 m steps; the height grid has a 2 m cell), water line and sun.

Map sheet and 360 view

  • Map sheet: Sheet title, Sheet style (Survey, Blueprint, Topographic, High contrast, Fog, Aged), Contours (Off, Every 2 m default, Every 4 m), Relief, Trees, Street names, Sheet grid, Redraw, Export PNG (<title>-sheet.png).
  • 360: Eye height 1–60 m (1.7), Resolution 2048 × 1024, 4096 × 2048 (default) or 8192 × 4096, Render 360, Export PNG (an equirectangular panorama). Drag to look around; the wheel changes the lens.

Floor Plan Designer

Floor Plan Designer generates and edits multi-level building charts with corridors, rooms, doors, stairs, items, props, hostiles and hand-drawn marks, viewable as a flat chart, a stacked 3D chart or a walkable 3D model.

Top bar and workflow preset

  • Workflow preset (bar at the top): General level design (default; turns off healing, ammunition, weapons, puzzle items, documents, traps, hostiles and scripted scenes), Adventure / puzzle, Action / survival, Atmospheric reference presets (the original stock settings).
  • GENERATE LAYOUT rolls a whole building from the SETUP settings; BLANK CHART starts empty; RESUME LAST SESSION appears when a previous session exists.
  • Views: DRAFT (sketch board only), CHART (finished chart), BOTH (side by side), 3D (levels stacked in perspective), 3D MODEL (walls, openings, items and props as 3D models).
  • LOAD IMAGE TO TRACE, IMPORT (JSON), EXPORT PNG, EXPORT ONE FLOOR, EXPORT JSON, UNDO (Ctrl+Z) and REDO (Ctrl+Y or Ctrl+Shift+Z).

SETUP tab

  • Campaign / game title, Location name (blank = invent one), Floors 1–10 (2), Basements 0–4 (0), Corridor density (Sparse, Standard, Dense), Projection (Top-down, Isometric, 3D — floors stacked).
  • Set width 10–160 (18) and Set height 8–104 (12); unchecked, the layout sizes itself. Scale — one square is 1 (step 0.5) metres or feet; the scale bar, survey stamp and route lengths follow it.
  • Difficulty (Surveyor rolls, EASY, NORMAL, HARD, NIGHTMARE) and Seed (blank = new). Without a pinned seed, every generation reshuffles layout, names, stock and notes.
  • Stock the building with: Save spots, Healing supplies, Ammunition, Weapons, Puzzle items, Light sources, Documents & lore, Tools, Valuables, Traps, Locked containers, Keyed doors (+ their keys), Sealed doors, One-way doors, Secret passages, Wall breaches, Sinkholes, Scripted scenes, Hostiles, Trace a suggested route.
  • Structural integrity: Coherent or Non-euclidean (orphaned rooms, doors in open floor, stairs to missing floors, routes that give up).
  • Floor plan: Let me draw the corridor shape myself, a footprint gallery, Same footprint on every floor, Same rooms on every floor, No gaps.

TOOLS, SHELF, PROPS and IMAGE tabs

GroupTools
EDITMOVE, ERASE, COPY (box-copy and stamp), ROTATE, WALL REMOVER, ERASE BOX, UNDO, REDO.
FLOOR PLAN+CORRIDOR, +ROOM, CORRIDOR BOX, ROOM BOX, CORRIDOR BOX WALL, ROOM BOX WALL, INSIDE / OUTSIDE, CLEAR CELL.
DOORS & PASSAGESDOOR, SEALED, ONE-WAY, BREACH, WINDOW, BREAKABLE WIN., SECRET, LINKER, WALL, LIGHT WALL, THIN WALL, ROTATE WALL, ERASE WALL.
STYLEBUCKET (room fill colour), HIGHLIGHT, TINT, with swatches and a custom colour.
RED PENSCRIBBLE, CIRCLE, UNDERLINE, SCRATCH OUT, ARROW, CROSS OUT, ? MARK, ! MARK, TICK.
MARKSSTAIRS, STAIR WELL, FIRE ESCAPE, SPIRAL STAIR, LADDER, SPAWN, EXIT, HOSTILE, SPAWNER, BLACKOUT, SINKHOLE, LABEL, NAME ROOM, ROUTE, ELEVATOR, BOSS, holes, HOLE+LADDER, LINK FLOOR.
OUTDOOR / TOWNWATER, RIVER, FOREST, PARK, DIRT, STREET, SIDEWALK, SLOPE, BUILDING, CLEAR TERRAIN, COMPASS, BLOCKED, BRIDGE, STREET NAME, DISTRICT, BALCONY, TREE, BUSH, LAMP, FENCE, FOG, PIER, CLIFF, ELEVATION, ROUTE BADGE, CAR, BENCH, GRAVE, DUMPSTER, HYDRANT, PHONE BOOTH.
WIPECLEAR ALL ITEMS (every floor, undoable), STRIP CHART (keep only walls).
  • SHELF: every door, breach, stair and item, searchable. Click one, then click the chart. PROPS: furniture and set dressing by theme; props never take a number in the key.
  • IMAGE: LOAD IMAGE… lays a reference plan under one level (Under which level, Opacity 5–90 %, default 35 %), with Left (X), Top (Y), Width, Height in squares, FIT GRID, KEEP PROPORTIONS, DRAG TO MOVE / RESIZE, Show it on the sketch board (DRAFT) too and Hide the image for a moment. The image is never exported.

Sketch board and 3D

  • DRAFT THE CORRIDORS: zoom (−, +, FIT, 1:1), GRID presets 18×12, 25×25, 50×50, 100×100 or W 10–160 × H 8–104, FILL SCREEN (BIG, MEDIUM, SMALL, TINY), tools CORRIDOR, ROOM and the box tools, a ground brush (Grass / park, Forest, Water, River, Dirt / sand, Street, Sidewalk, Slope, Building block) with BRUSH 1 or BRUSH 4, Clear this floor, Copy previous level, Ring rooms around corridors.
  • 3D MODEL: RESET, TOP, LOW, WALK (eye-height walk: WASD or arrows move, drag looks, Q/E change level, Esc returns to orbit), Realistic (2.6 m walls, ceilings, fog and a flashlight), Ceilings, Glass floors, WALLS height, FLOOR GAP, SHOW one or all levels, per-level see-through sliders, Items & props, Names. Middle-drag or left-drag orbits, Shift+middle-drag pans, wheel zooms; you can place shelf items on the model.
  • 3D STACK: Stack the floors, LIFT, the level that receives clicks, and see-through sliders. FLOORS lays levels out AUTO or 1–4 across.

Chart shortcuts: M move, T rotate, E erase, D door, C corridor, V room, L label, H hostile, P red pen, ]/[ turn the hovered item, right-click removes; Ctrl+wheel zooms at the cursor and middle-drag or Space-drag pans.

Note. The editor's quick guide says “Survey the building”; the button is labelled GENERATE LAYOUT in Isberg Labs.

Editable state and exports

Save editable world writes gamebench-editable-world.json with the complete native state of every editor you have opened (geometry, settings, game presets and generation seeds). Open editable world validates the schema and terrain grid before restoring; files must be under 64 MB, and a failed open restores the previous state. Saving the Isberg project stores the same state. The image and model exports below do not contain the editable recipe.

EditorExport menu entryFile
Town GeneratorMap imagePNG at the chosen export resolution
Editable town setup<name>.isberg-town.json
PSX Builder3D modelpsx-building.obj + psx-building.mtl (keep them together)
Viewport screenshotpsx-building.png
Town plan imagetown-map.png (street and district scenes)
Vector town plantown-map.svg (street and district scenes)
Terrain StudioEditable terrain project<title>.overpass.json: terrain, roads, props, labels
Viewport screenshot<title>-view.png
Illustrated map sheet<title>-sheet.png (360 panoramas: <title>-360.png)
Floor Plan Designer3D model screenshotisberg-floorplan-3d.png (while the 3D model is open)
Full chart imagesurvey_chart_…_<seed>.png
Single floor imagePNG of the chosen level, with or without paper
Editable floor plansurvey_layout_<seed>.json (all levels and placed items; IMPORT (JSON) restores it)
Limits. World builder does not export tile maps, tilesets or native tile documents, and it has no tile clipboard. For tile clipboard copy and paste, see Pixel & animation; for .isbtiles tile models, see Tile modeler; for playable levels, see Level & playtest.

MCP tools

Troubleshooting

An export menu entry is greyed out
It needs a state that does not exist yet: generate a chart first, open the 3D model, or switch PSX Builder to a street or district scene.
“Editable world files must be under 64 MB.” or a validation error on open
The file is too large or not a World builder file. The previous maps are restored.
“Choose a town setup exported by this generator.”
Open setup accepts only Town Generator setup files up to 2 MB.
“World editor did not initialize”
An editor did not finish loading for an automated call. Open its tab once, then retry.

Tile modeler and Vertex painter

The Tile modeler builds textured 3D geometry from square tiles placed on a grid, with atlas UVs, per-corner editing, subdivision, extrusion and vertex colours, and saves it as an .isbtiles document. The Vertex painter paints RGBA vertex colours and normals on meshes and whole scenes, with masks, topology tools, swatches, snapshots and safe reimport. The Vertex painter is also the Vertex paint view of the Tile modeler.

Tile modeler views

The Tile modeler has four view buttons. All of them edit the same scene document; switching views carries your current geometry across.

ViewPurpose
Tiles, UVs & paintingThe tile editor described in this chapter.
Scene, rig & animationThe full 3D scene editor on the same scene: transforms, rigs, clips and acts. See 3D scene & animation.
Vertex paintThe scene-aware Vertex painter on the same scene. See Vertex painter and Scene targets.
Import & exportFormat import and export, including reference tile formats. See Formats & interchange.

Each view's camera and settings are remembered when you switch away, and the Isberg project keeps the active view.

Drawing tiles

A tile is a quad (two triangles) lying on a grid plane, with four corners that each have a position, a UV and an RGBA colour.

ControlOptions
ToolDraw (stamp the selected atlas tile), Select faces, Edit vertices (drag the corner nearest the click), Erase, Paint color.
PlaneFloor · X/Z, Wall · X/Y, Wall · Y/Z.
LayerThe plane's offset along its normal axis, in whole steps (default 0).
GridTile size and snap, 0.125–16 units (default 1).
ColorColour for new tiles, Paint color, Paint selected and texture painting.
Paint vertexAll corners or Corner 1–Corner 4.

Mouse and keyboard

InputAction
Left-click / left-dragApply the current tool. Drawing on an occupied cell selects that tile instead.
Ctrl+clickAdd or remove a face from the selection (Select faces, Edit vertices).
Right-dragErase tiles with any tool.
Middle-dragPan.
Space+left-drag / Space+right-drag / Space+middle-dragOrbit / pan / zoom.
WheelZoom.
TabToggle between Draw and Select faces.
W A S DMove the XYZ crosshair one grid step along the view-aligned axes (Space+W/S moves in depth). With a selection and a tool other than Draw, the selected tiles move too; hold Shift to move only the crosshair.
Q / ERotate the selection −90° / +90° around the plane's axis, pivoting on the crosshair.
Ctrl+A / Ctrl+C / Ctrl+VSelect all / copy / paste tiles.
DeleteDelete the selected tiles.
Ctrl+Z / Ctrl+Shift+ZUndo / redo (up to 75 steps).

The status line shows tile and triangle counts, the grid size, the plane and layer.

Texture atlases

  • A new model starts with a small four-colour atlas. Import image (under Texture atlas) replaces the active atlas with an image; if an image is selected on the project asset shelf, that image is used, otherwise a file dialog opens.
  • Tile width and Tile height (default 16, or the image size if smaller) divide the atlas into cells. Click a cell in the atlas preview to choose the tile that Draw stamps.
  • In UVs & texture painting, the Atlas list switches the active atlas; Add image atlas adds another one and Remove atlas removes the active one (tiles that use it move to another atlas; one atlas must remain).
Limits. Up to 256 atlases per model, embedded as PNG or JPEG, each under 96 MB of encoded data. Up to 100,000 tiles per model.

Editing tiles and corners

Selection panel

  • The XYZ fields show the selected tile's position and double as the crosshair. Move moves the selected tile there (snapped); Add at XYZ adds a tile there.
  • Duplicate (offset by one grid step), Delete, Paint selected (applies Color to the corners chosen in Paint vertex).
  • Rotate 90° rotates the tile on its plane. Turn UV rotates its UVs a quarter turn; Flip UV mirrors them.
  • Invert normals flips the tile's facing. Smooth normals: off/on toggles smooth shading for model exports.
  • Undo and Redo.

Faces & vertices

  • Select all, Clear selection. Vertex: Whole face or Corner 1–Corner 4; transforms, snapping and welding then act on that corner of each selected tile.
  • Copy, Paste (offset by one grid step), Flip diagonal (changes which diagonal splits the quad), Reverse face.
  • Divide columns / rows (1–64, default 2 × 2) with Subdivide selected.
  • Cut U/V (axis u or v, position 0.001–0.999, default 0.5) with Cut selected.
  • Extrude distance (default 1) with Extrude selected: adds four side faces and a cap and keeps the original face; the cap becomes the selection.
  • Snap to grid, Weld vertices (merges coincident corners; up to 20,000 vertices at once).

Transform selection

Enter Move XYZ, Rotate XYZ °, Scale XYZ (default 1) and Pivot XYZ, then press Apply transform. The line at the bottom of the panel reports each operation and the tile count, or the error.

UVs and texture painting

The UVs & texture painting section shows the active atlas with the selected tile's UV quad. Canvas tool:

  • Drag UV corners: drag the nearest corner; it snaps to atlas pixels. The highlighted corner is the one in the Corner list. To type exact values, choose Corner 1–4, enter U and V and press Set UV corner.
  • Paint texture / Erase texture: paint the atlas image itself with the main Color, using Brush pixels (1–128, default 2). Every tile that uses the atlas updates.

Saving and exporting tile models

ButtonResult
Savemodel.isbtiles: the complete editable scene, with atlases, tiles, colours and retained source metadata.
OpenOpens .isbtiles, legacy .gbtiles or a model JSON document.
NewStarts an empty model with the default atlas (undoable).
glTFmodel.gltf with the atlas and vertex colours embedded.
OBJmodel.obj with geometry, UVs and vertex colours.
PNGmodel-view.png of the current view.

Units are grid units. For GLB, Collada, FBX, PLY, STL or TMX, use the Import & export view or the model_export tool. Crocotile-style tile documents (.croco, .crocotile, .c3dp) are read through Formats & interchange; they are import-only, and edits are saved as .isbtiles.

Limits. OBJ does not carry atlases as materials or any animation. Static formats report what they cannot keep; the .isbtiles document and the Isberg project keep everything.

Vertex painter

The Vertex painter (toolbar title Mesh Painter) edits an indexed triangle mesh with per-vertex positions, normals, RGBA colours and optional UVs, second UVs, tangents and custom attributes. It starts with a demo mesh.

  • Open OBJ / JSON opens a mesh. A JSON file that holds an Isberg scene opens in scene mode (see Scene targets).
  • Reimport source transfers your paint onto a refreshed version of the mesh (see Snapshots and reimport).
  • Export OBJ (painted-mesh.obj), Export JSON (painted-mesh.json, or painted-scene.json in scene mode), Snapshot PNG (mesh-preview.png).
  • Undo, Redo (40 steps), Fit (frames the mesh and resets the brush radius to suit it), Demo.

The left panel holds the brush, the centre the viewport and status, the right panel targets, masks, display, topology, colour actions and snapshots.

Brushes and channels

ControlOptions and rangeDefault
ActionPaint brush, Eyedropper, Select vertex, Select triangle, Box mask, Circle mask, Lasso mask, Orbit viewPaint brush
ChannelVertex RGBA, Normal vectorVertex RGBA
Brush targetVertex, Edge (distance to the nearest edge; both endpoints), Face (closest triangle point; all three corners)Vertex
Shared recordsMeshes: Shared positions or Independent face records (duplicates triangle corners so faces paint separately). Scenes: Retain scene records.Shared positions
RGB color, AlphaColour; 0–1#ef9f69; 1
Background / replace targetColour used by Replace as the colour to find; Swap foreground / background exchanges the two—
R G B AChannel switches for brushes and colour actionsAll on
Brush radius (world units)0.0001–10000Set by Fit
Opacity0–10.7
FalloffSmooth, Linear, Constant, Custom curveSmooth
Normal X, Normal Y, Normal Z−1 to 1 (normal brush target; normalized after blending)0, 1, 0

With Custom curve, a small curve editor appears (radius to the right, weight upward): drag points, double-click to add (up to 16), right-click to remove.

Masks and display

  • Mask actions: Box mask, Circle mask, Lasso mask, Select vertex, Select triangle. An unmodified gesture replaces the mask, Shift adds and Ctrl subtracts. All, Clear, Invert, Grow, Shrink modify it.
  • A non-empty mask limits every brush and colour action to the masked vertices.
  • Named sets: type a Selection set name and press Store selection set; choose one in Saved sets and use Load selection set or Remove selection set. Sets are saved with the project.
  • Display: Wireframe, Show vertices, Front-facing only (on; occluded surfaces are not painted), Visualize normals, Preview only (materials remain intact) (Vertex color, Material × vertex color, Red channel, Green channel, Blue channel, Alpha channel), Ignore transparent records (skips transparent vertex records, judged by vertex alpha), Show masked vertices only, Brush HUD (on), Vertex glyph size 1–20 (3), Normal glyph distance 0–10 (0.15).

Normals and topology

ButtonEffect
Smooth normalsCorner-angle-weighted normals across coincident positions.
Hard normalsFace normals; only compatible coplanar records stay shared.
Auto smooth 60°Smooths edges below a 60° angle and hardens the rest.
Generate tangentsBuilds tangents from UVs (requires UVs).
Invert normalsScene resources invert the vectors and keep winding; standalone meshes also invert winding.
Split triangle verticesGives each triangle corner its own record.
Merge compatible recordsMerges coincident records. Standalone meshes average colours and keep the first UV; scenes keep seams where colour, UV or deformation data differ.
Invert winding + normalsReverses triangle winding with the normals.

Existing tangents are re-orthogonalized after normal edits. Topology changes clear saved masks.

Color actions and swatches

  • Fill sets the enabled channels to the brush colour. Round rounds each channel to 0 or 1 (0.5 rounds up). Replace changes records within Replace threshold (0–2, default 0.1; Euclidean distance over the enabled channels) of the background colour to the brush colour. Randomize uses Random seed (default 1) for reproducible results. All respect the mask and channel switches.
  • Swatches: click a swatch to use it, right-click to remove it. Add foreground, Swatches from image (up to 64 unique colours from an image), Save swatches (mesh-swatches.json) and Load swatches (up to 256 #RRGGBB or #RRGGBBAA entries). Swatches are saved with the project.

Snapshots, reimport and history

  • Store snapshot captures positions, colours, normals and UV context (masked vertices only, if a mask is set) in the project. Restore snapshot applies it by position (within 0.0005 units), ranking stacked records by normal and UV, and reports matched and ambiguous counts.
  • Save snapshot file (mesh-snapshot.json) and Load snapshot file move snapshots between projects.
  • Choose snapshot autosave file and Snapshot autosave seconds (0 disables) (0–3600) store a snapshot on a timer and write it to the chosen file. A reopened project must choose its autosave file again.
  • Reimport source loads a refreshed OBJ or JSON and transfers colours and normals: exact vertex/index correspondence first, then strict snapshot matching. Unsafe matches are refused.
  • Reset to import restores the originally imported mesh (in scene mode, the original resources of the targets, keeping current transforms).
  • Esc cancels the current stroke. Every stroke and mesh operation can be undone.

Scene targets and animation preview

In scene mode (from the Tile modeler's Vertex paint view, or after opening a scene JSON) the painter edits mesh nodes of the full scene. World-space brushing combines each node's transform and writes back to the node's own mesh resource. A mesh shared by several instances is edited once and keeps its resource ID.

  • Scene targets: tick the mesh nodes to paint; shared meshes show shared ×n. Scene branch with Select branch + descendants, and Select all mesh nodes. At least one target must stay selected.
  • Animation preview: Evaluate skin, morph and animation, Preview clip (or Authored pose), Preview choreography, Preview time (seconds) and Play preview/Pause preview. Colour strokes in a posed preview map back to the authored vertices.
  • Edits keep node and material IDs, hierarchy, rigs, morph targets, UV and custom streams and unknown metadata. Topology tools remap dependent skin, morph, UV, custom and LOD records.
Limits. The normal brush is refused on a deformed pose; turn the animation preview off and edit normals in the base pose. Animation is never baked. Topology operations refuse resources whose indexed metadata cannot be remapped. The preview does not run engine materials, shaders or editor plugins, and this is not a full Godot vertex-painter plugin equivalent.

Vertex painter keyboard and mouse

InputAction
Alt-drag or right-dragOrbit.
Middle-dragPan.
Wheel / Ctrl+wheelZoom / change brush radius.
[ / ]Resize the brush.
F1 / F2Colour channel / normal channel.
XSwap foreground and background colours.
Shift+EEyedropper.
Ctrl+V / Ctrl+E / Ctrl+FBrush target Vertex / Edge / Face.
Ctrl+Z / Ctrl+Shift+ZUndo / redo.
EscCancel the current stroke.

Formats

FormatTile modelerVertex painter
.isbtiles (legacy .gbtiles)Open and save—
Model / mesh JSONOpenOpen and export (meshes or complete scenes)
glTF (.gltf)Export, atlas and vertex colours embedded—
OBJExportOpen and export with vertex colours (v x y z r g b a), normals and the first UV channel
PNGAtlas import, view exportSwatch source, view export
Snapshot and swatch JSON—Open and save
GLB, DAE, FBX, PLY, STL, TMX, Crocotile filesThrough Import & export (Formats & interchange)—
Limits. The Vertex painter accepts meshes of 3 to 250,000 vertices and OBJ text up to 64 MB. OBJ polygons are fan-triangulated, so triangulate concave or non-planar polygons before importing; OBJ material references, MTL textures, skeletons, blend shapes and LOD buffers are not part of the standalone mesh representation. The viewport is a depth-sorted editing preview, not a production renderer.

MCP tools

Tile modeler

  • model_create — create a tile scene with an optional embedded atlas.
  • model_edit — add, remove, transform and duplicate tiles; edit corners and UVs; diagonal, subdivide, cut, extrude, snap, weld, copy/paste and atlas operations.
  • model_export — export to OBJ, glTF, GLB, DAE, FBX, PLY, STL, TMX or .isbtiles.
  • interchange_export — export a scene, including editable .isbtiles documents.

Vertex painter (meshes)

Vertex painter (scenes)

These tools work on exported scene JSON or painter documents and write .json, .isbscene or .mesh. Export the scene from the .isberg project first; they do not rewrite a whole project. Each change replaces the file atomically and keeps up to 50 revisions in a .scene-painter-history folder beside it.

The editors themselves are workspace IDs model and mesh for workspace_commands, workspace_execute and studio_workspace_state.

Troubleshooting

“Select a tile first” / “Select tiles first”
Selection buttons need a selected tile. Use Select faces and click one, or Ctrl+A.
“Tile size must fit the atlas”
Tile width and Tile height cannot exceed the atlas image size.
“Scene exceeds tile limit”
A model holds at most 100,000 tiles; subdividing, extruding and pasting count toward it.
“Keep at least one atlas”
The last atlas cannot be removed. Add another before removing this one.
“Tangent generation requires UV coordinates.”
The mesh has no UVs. Unwrap it in the 3D editor or another tool first.
Painting has no visible effect
Check that a mask is not excluding the area, that the needed R/G/B/A switches are on, and that Front-facing only is not hiding the surface. In scene mode, the node must be ticked under Scene targets.
A snapshot restore or reimport reports ambiguous or unmatched records
Positions changed beyond the 0.0005-unit tolerance or stacked records could not be told apart. Strict transfers refuse those records rather than guess.

3D scene & animation

The 3D scene & animation editor models, rigs, lights, animates and exports complete scenes. It combines component modeling with tile, block and sticky-edge brushes, a skeleton with four-influence skin weights, IK and constraints, morph targets, a clip timeline, choreography acts with weight curves, and local rendering to PNG frames or WebM. All geometry, rigging, playback and file conversion run inside Isberg Labs.

Workspace layout

Open 3D scene & animation from the Tools palette. A new editor starts with one cube. The editor has four areas:

Sidebar (left)
The Scene hierarchy tree, the object name and parent, the local transform fields, and collapsible sections: Geometry & selection, UVs & materials, Skeleton & weights, IK, constraints & retargeting, Morph targets, Camera, light & environment and Points & prefabs. Below them are the modeling panels (Tile and block brushes, Additional primitives, Billboard and mirror, Skeleton root and bone display, Four vertex influence slots, Native channel curves and targets) and the native timeline panels (Action curves, UV frame sequences, Choreography segments & camera markers). The ☷ toolbar button hides or shows the sidebar.
Toolbar (top)
The transform tool (Select, Move, Rotate, Scale), the local axis (X, Y, Z), the primitive list with Add mesh, Undo, Redo, Frame, Import, Save, the export format list with Export, and a renderer tag that reads LOCAL WEBGL or LOCAL SOFTWARE.
Viewport (centre)
The WebGL view with local lights and shadows. When WebGL cannot start, a software renderer with simplified shading takes over. The status bar under the viewport shows object, vertex, triangle and selected-component counts and the playhead time.
Timeline (bottom)
Clip playback, keys, markers, acts and rendering. See Clips, keys, markers and acts.

Viewport navigation

InputAction
Right-drag, or Alt+left-dragOrbit the view. Orbiting leaves an active scene camera and returns to the orbit view.
Middle-drag, or Shift+right-dragPan.
Mouse wheelZoom.
Left-clickSelect an object, or a vertex, edge or face in component modes. Clicking near a bone origin selects the bone.
Shift+click / Ctrl+clickAdd components to / remove components from the selection.
Left-drag with Move, Rotate or ScaleTransform the selected components, or the selected object, along the chosen local axis.
FrameCentre the view on the selected mesh.

The viewport hint reads "Middle/Shift-drag pan"; Shift with the left button adds to the selection, so use Shift with the right button to pan.

Units and undo

Geometry units are metres. Rotations are stored as normalized XYZW quaternions; the sidebar shows them in degrees. Undo and Redo keep 60 editor steps, and each brush stroke is one step. Scenes are saved with the shared .isberg project (see Projects).

Objects and hierarchy

Every scene object is one of five types: mesh, group, bone, camera or light.

  1. To add a mesh, choose cube, plane, sphere or cylinder in the toolbar list and click Add mesh. The new mesh uses the material chosen under UVs & materials.
  2. To add other objects, click Group, Bone, Camera or Light under Scene hierarchy. A new bone becomes a child of the selected bone, one metre above it.
  3. Select an object in the tree or in the viewport. Edit Name, and choose a Parent (or Scene root). Reparenting keeps the object's world transform; the list never offers the object's own descendants, and hierarchy cycles are rejected.
  4. Enter position, rotation (degrees) and scale under Transform · local and click Apply object. If Auto-key is on in the timeline, Apply object writes a key instead. Transforms apply to the bind or the current pose.
  5. Instance adds another object that shares the selected mesh geometry, offset one metre on X. Geometry edits affect every instance. Delete object removes the object and its descendants.

The tree marks bones ◇, meshes ⬡, groups ▾, lights ☼ and cameras ▣, and indents children under their parent.

Note. A bone that a skin still uses cannot be deleted. Select the mesh, click Unbind, then delete the bone.

Component modeling

Open Geometry & selection and choose a Component mode: Object, Vertices, Edges, Faces (triangles) or Weight brush. Select a mesh first.

Selecting components

  • Click in the viewport to pick the nearest vertex, edge or face; Shift+click adds and Ctrl+click subtracts.
  • All, Invert and Clear act on the whole mesh.
  • Type zero-based component IDs in IDs (for example 0,1,2) and click Select IDs.
  • Selected vertices are drawn as yellow squares over the mesh.

Editing geometry

ControlEffect
SplitGives the selected faces their own vertices, so they can move apart.
SubdivideSplits each selected triangle into four, with shared midpoint vertices.
ExtrudePushes the selected region out by Distance (default 0.5) and adds boundary side walls.
Delete facesRemoves the selected faces. You cannot delete every face; delete the object instead.
Apply to verticesApplies the transform fields to the selected vertices: position and rotation act as a delta and scale as a multiplier.
Vertex color + Paint selected verticesPaints the RGBA vertex color of the selection (or the whole mesh when nothing is selected).

Split, subdivide, extrude and delete apply to selected faces in Faces mode, and to all faces otherwise. Topology edits interpolate existing skin weights, UVs, second UVs, tangents and custom attributes onto new vertices.

Tile, block and sticky brushes

The Tile and block brushes panel paints atlas geometry directly in the viewport. Choose a Brush, then drag in the viewport. Each stroke is one undo step.

BrushWhat it places
OffNo painting; the viewport selects and transforms.
TileA snapped, textured quad on the chosen Plane (xz floor, xy wall, yz side), or on the picked face.
BlockA cube of six outward-facing quads.
Sticky edgeA quad hinged to a boundary or crease edge of the picked face. Internal triangulation edges are ignored, even when vertices are split. Edge picking works slightly outside the face.

Gestures

  • Left-drag paints. The right button removes the picked tile or the whole block.
  • Alt+drag orbits and the middle button pans while a brush is active.
  • With no face under the pointer, Tile and Block place on the construction plane through the origin. If the plane is edge-on, orbit the view.
  • Place puts one brush at the XYZ fields on the selected face. Remove selected removes the selected tile or block.

Brush options

OptionDefaultMeaning
Size1Brush edge length.
Grid1World-space snap step for positions.
Hinge °0Sticky hinge angle, −360 to 360, used by Hinge angle mode.
StickyCamera planeCamera plane snaps the edge basis to the view axes and projects the pointer ray onto that plane; Hinge angle uses the explicit angle.
Keep aspectOffKeeps the width/height ratio, including UV quarter turns.
Normal sizeOffRestores the authored brush dimensions. Holding Shift while painting does the same.
Height1Sticky quad height.
MaterialFirst materialEmbedded scene material for new geometry.
UV X, Y, width, height0, 0, 1, 1Atlas rectangle in UV units (steps of 1/16).
Flip U, Flip V, TurnOff, off, 0°Mirror the atlas rectangle and rotate it by 0°, 90°, 180° or 270°.
XYZ0, 0, 0Position for Place and for new primitives.

Sticky placement also works on a posed, skinned mesh, because the brush reads the evaluated geometry.

Wedge, cone and other primitives

PrimitiveWhereNotes
CubeToolbar, Add meshSix faces with UVs, size 1 m.
PlaneToolbar, Add meshOne quad on X/Z.
SphereToolbar, Add meshUV sphere, 16 segments and 8 rings by default. MCP accepts 3–128 segments and 2–128 rings.
CylinderToolbar, Add meshCapped, 16 segments by default.
WedgeAdditional primitivesClosed triangle mesh with UVs.
ConeAdditional primitivesClosed, segmented; Segments 3–128, default 16.
Textured tileUVs & materials, Add textured tileOne atlas cell on Floor X/Z, Wall X/Y or Side Y/Z.

Wedge and cone use the brush panel's material, UV rectangle and XYZ position. Click Add to create them.

UVs and materials

Open UVs & materials.

  • Material lists the scene's embedded materials. Assign gives it to the selected mesh.
  • Image → material reads a local image, embeds it as PNG in a new material, assigns it to the selected mesh and records the atlas grid from Atlas columns and Atlas rows. Textures display with nearest-neighbour filtering.
  • The UV fields are offset X, offset Y, rotation in degrees (steps of 90), scale X and scale Y. Apply UV transforms the UVs of the selected vertices, or the whole mesh.
  • Tile index, Atlas columns, Atlas rows and Tile plane with Add textured tile add one atlas cell at the transform position. The index must be inside the grid.

Each material has a color, an optional embedded PNG or JPEG texture, roughness (default 1), metallic (default 0), double-sided rendering (default on) and an alpha mode (OPAQUE, MASK or BLEND, default BLEND). The sidebar edits color through vertex painting and texture through Image → material; set the other properties with scene3d_material. To run custom shader source on a material, attach a shader document (see Using shaders on 3D and level materials).

Lights, cameras and environment

Open Camera, light & environment.

ControlRange / defaultEffect
BackgroundDefault #17202cScene background color.
Ambient0–10, default 0.65Ambient light strength.
Apply environmentApplies background and ambient.
Light typepoint, directional, spot, ambientKind of the selected light.
Light color, IntensityIntensity 0–10,000, default 2Applied with Apply selected light.
Projectionperspective, orthographicKind of the selected camera.
FOV / sizeFOV 1–179°, default 50; orthographic size default 10Applied with Apply camera.
View selected cameraLooks through the selected camera.
Return to orbit viewReturns to the editor's orbit camera.

Lights also carry a range, a spot angle (default 45°) and a cast-shadow switch (default on); cameras carry near (default 0.01) and far (default 1000) planes. The environment can hold fog (color, near, far). Edit these with scene3d_material (environment, activeCamera) and scene3d_object. Light and camera parameters can be animated through property targets (see Named curve forms and property targets).

Points, instances and prefabs

  • Point name (default Socket) and Add point at position store a named local point on the selected object at the transform position fields. The panel lists the object's points.
  • Save subtree saves the selected object and its descendants, with their meshes, materials, bones, skins and animation, as subtree.prefab.json.
  • Instantiate prefab loads a prefab or scene .json and adds it at the origin with remapped IDs.

A prefab of a skinned mesh must include its skin bones. Constraints whose targets are inside the subtree travel with it. A constraint with a target outside the subtree is kept as unresolved data with its missing IDs; it is not run against an invented target.

Bones and skin weights

Binding a mesh

  1. Build a bone hierarchy with Bone (select a bone first to add a child).
  2. Select the mesh and open Skeleton & weights.
  3. Click Bind all bones. Automatic weights use inverse distance from each vertex to the bone origins. Bind matrices and the bones' rest transforms are captured now.

A skin uses 1 to 256 bones and keeps at most four normalized influences per vertex. Unbind removes the skin; Rest pose restores every bone to its captured transform. Pose bones with the same transform fields and tools as objects. The info line shows the bone count and weighted vertex count.

Editing weights

  • Assign selected weights gives the selected vertices (or all vertices) full Weight (0–1, default 1) on the Active bone, normalized with the other influences.
  • In Weight brush component mode, drag on the mesh to paint the active bone with Brush radius (default 0.5), Strength (0–1, default 0.5) and Weight. The viewport colors vertices from blue (no influence) to red (full influence). Bind the mesh first.

Skeleton roots and bone display

In Skeleton root and bone display, choose a Root bone and click Bind root to bind the selected mesh, or every mesh in a selected group, to that bone and its descendants. Influences on matching bones are kept unless Automatic weights is on. Length (default 1) and Thickness (default 0.1) with Set display change how a bone is drawn only; they never scale the transform or the deformation.

Four vertex influence slots

  1. Select vertices in Vertices mode, or enter one Vertex index.
  2. Click Read to load that vertex's four slots.
  3. Choose a bone (or None) and a weight for each of the four slots, then click Apply to selection.

Weights normalize to one. Duplicate bones merge for deformation, while the authored slot order is kept for native export until another weight edit changes it. A zero total assigns the first bound root. A bone the skin did not use yet is added with an inverse bind from the current pose.

Skinning is inverse-bind linear blend skinning; normals use the matching inverse-transpose transforms.

IK, constraints and retargeting

Constraints run after animation and choreography during every evaluation. Open IK, constraints & retargeting.

  1. Select the constrained object; for IK, select the chain's root bone.
  2. Choose a Constraint type and a Target object, or keep World position and type a World target (default 1,1,0).
  3. For IK, click Use selected bone chain to fill Joint chain IDs by following child bones from the selected root, or type the IDs yourself.
  4. Set Weight (0–1) and optional Options JSON, then click Add constraint.
ConstraintBehavior
twoBoneIKAnalytic two-bone IK. The chain is exactly three contiguous joints (for example root, elbow, wrist). A pole object or pole position bends the middle joint.
chainIKIterative (FABRIK) chain IK over 2–64 contiguous parent-child joints.
lookAtAims the object at the target.
copyTransformCopies the target's transform channels.
limitRotationClamps rotation between minimum and maximum values.
distanceKeeps a distance to the target.
parentWeighted parent constraint with 1–16 weighted targets.

The Options JSON object accepts the constraint's advanced fields, such as pole (object ID), polePosition, axis, offset, channels (any of translation, rotation, scale), min/max, targets (for parent: [{node, weight}]), iterations, tolerance and enabled. A scene holds at most 256 constraints. Invalid references are rejected, and the report under the constraint list shows each constraint's reach error or state.

Select a constraint in the list and click Remove constraint to delete it.

Bake current rig clip

Bake current rig clip samples the evaluated pose of the current clip at the timeline FPS into a new clip. The baked clip bypasses live constraints during playback, so they are not applied twice. Bake before exporting to formats that cannot carry constraints.

Retarget source animation

  1. Click Open source scene and choose a scene .json with the source skeleton and clips.
  2. Choose the source clip. Source → target bone map is filled with bones whose names match; edit the JSON map of source name or ID to target name or ID. Each target bone needs exactly one source.
  3. Click Retarget into this scene.

Retargeting transfers hierarchy-aware world rotations from the source rest pose to the target rest pose, keeps the target's proportions and creates an editable sampled clip at the timeline FPS (1–120). Root motion and a translation scale are options of scene3d_retarget.

Limits. The solvers are numerical and finite. Extreme shear or non-uniform scale can reduce accuracy; check the diagnostics and bake the result when exact output matters.

Morph targets

Meshes imported with morph targets (blend shapes) list them under Morph targets. Choose a target, enter Weight (−10 to 10) and click Apply target weight. Morph weight clips play on the main timeline. Morphs are evaluated before skeletal deformation and never modify the base mesh. To bring in morphs, import glTF/GLB, FBX or Collada through Formats & interchange.

Billboards, mirrors and directional UVs

The Billboard and mirror panel sets live behaviors on the selected object. Click Apply after changing them.

ControlEffect
Billboard + Camera directionThe object faces against the view's forward vector.
Billboard + Camera positionThe object faces the camera point.
Lock local YTurns only around the authored local up axis, including under a tilted parent.
Snap + angleQuantizes the billboard yaw (0.01–360°, default 45°).
Mirror + axis (x, y, z)Creates a linked mirror that reflects the source each frame and reuses its posed mesh, so skin and animation motion follow. Edit the source, not the generated mirror.
Directional UV actionsSelects the UV action named basename + _S, _SW, _W, _NW, _N, _NE, _E or _SE on the same atlas from the camera angle. Clear a direction's checkbox to disable it; neighboring sectors widen. A missing variant keeps the original action.

These behaviors are kept in the Isberg scene and project files. Standard interchange formats bake them or drop the live link.

Clips, keys, markers and acts

Clips and playback

  • ▶ plays or pauses. The clip list chooses No clip or a clip; + Clip adds one.
  • Scrub with the playhead slider, or type a time in seconds.
  • Duration (default 2 s), FPS (1–240, default 24) and Loop (default on) apply to the current clip.

Keys

  1. Select an object and set its transform fields (or its UV offset fields under UVs & materials).
  2. Choose a channel: Transform (position, rotation and scale together), Position, Rotation, Scale, Visibility or UV offset.
  3. Choose an interpolation: LINEAR, STEP or CUBICSPLINE (cubic Hermite).
  4. Click ◆ Key selected. Without a clip, a new one is created.

Key buttons appear under the timeline as ◆ time channel. Click one to seek; right-click to delete it. Rotation keys interpolate along the shortest arc. Cubic tangents default to zero; set explicit tangents with scene3d_animation. UV scale tracks are also available through MCP.

Markers

Type a Marker name and click + Marker to mark the playhead time. Markers show as ⚑ time name; click to seek, right-click to delete. During playback, crossed markers are listed under the timeline. Markers can carry a structured payload through MCP.

Choreography acts

  1. Click + Act (a 10-second act) and choose it in the act list (Clip playback plays plain clips).
  2. Choose a clip and select the object whose subtree it should drive.
  3. Set Rate (0.01–100), Mix (weight 0–1) and Offset, place the playhead at the start time and click Add clip to act. The Loop checkbox sets the item's looping.

Act items also have a mute switch, editable through scene3d_animation.

Action curves, UV sequences and choreography

The native timeline panels in the sidebar edit per-property action curves, UV frame sequences and weighted choreography segments. The Tile modeler's Scene, rig & animation view uses the same controls. Every edit is one undo step, and selecting an action or act moves the main playhead to it.

Action curves

  1. Select an object, type an action name and click New for selected object. Rename renames the chosen action.
  2. Type a Property (suggestions: position, rotation, scale, visibility, opacity, color, fov, zoom, intensity, roughness, metallic) and a Component (x, y, z, w, r, g, b, a, value). Transform properties need X, Y or Z. Click Read channel.
  3. Enter Time and Value, choose the key's outgoing interpolation, and click Set key.
  4. Select several keys in the list to Delete selected, Copy selected, Paste at time (the earliest copied key lands at Time) or Move selected keys by Shift seconds (default 0.1).

Interpolation choices are linear, discrete, the easeIn, easeOut and easeInOut variants of Quad, Cubic, Quart, Quint, Sine, Expo, Circ, Back, Bounce and Elastic (for example easeInOutCubic), and every saved named curve. A move that would land on another key fails and leaves the scene unchanged. Key times range from 0 to 86,400 seconds; a channel holds up to 100,000 keys.

UV frame sequences

  1. Type a name and click New; Rename renames it. Assign to selected attaches the sequence to the selected object, which must have UVs.
  2. Pick a frame, set Frame duration (default 0.1 s) and the U and V of Corner 1 to Corner 4, then click Apply frame.
  3. Duplicate, Delete, Earlier and Later manage frames; Copy frame and Paste frame insert a copy. A sequence keeps at least one frame.

Choreography segments and camera markers

  1. Type a name and click New act.
  2. Choose a segment Type (3D action or UV sequence), an Action and an Actor (All actors or one object).
  3. Set start (default 0), duration (1), timescale (1; negative values play backwards), offset (0) and weight (1), and Loop segment.
  4. Click Add segment, or select a segment and click Update selected or Remove selected.
  5. To switch cameras, choose a Camera, enter Switch at and click Add camera switch; Remove switch deletes the selected switch.

Segment weight curves

The Selected segment weight curve box graphs the selected segment's contribution over its local time.

  • Drag a key point in the graph to move it in time and value. Dropping it onto another key is rejected and nothing changes.
  • Enter Local time and Amount, choose an interpolation and click Set weight key.
  • Select keys to Delete selected, Copy selected, Paste at time or Move selected weights by Shift seconds.

Curve times are relative to the segment start. Playback clamps the contribution to 0–1, while stored values are kept as entered. Deleting every weight key restores full contribution. The MCP tool scene3d_timeline_edit exposes the same edits, including weightKeys, removeWeightKeys and shiftWeightKeys.

Named curve forms and property targets

The Native channel curves and targets panel defines reusable named easing curves and binds numeric channels to scene properties.

Curve forms

  1. Choose Saved curve (or New curve) and type a Name (1–100 characters, default Custom ease).
  2. Choose a Kind and set its fields. The graph previews the curve from 0 to 1 and shows its midpoint value.
  3. Click Save curve. Saved names appear in the action-key and weight-key interpolation lists.
KindFieldsRules
Cubic Bezierx1, y1, x2, y2 (default 0.25, 0.1, 0.25, 1)Drag the two handles in the graph or type values. X controls stay between 0 and 1.
PolynomialCoefficients, constant first (default 0, 0, 1)1–64 comma-separated numbers in ascending powers.
Sample keysTime (0–1), Value, Set sample, Delete selected, Between samples (Linear or Step)2–100,000 keys on normalized curve time.
StepsSteps (1–100,000, default 4), Jump at (End or Start)
FormulaFormula (default t ^ 2)t runs from 0 to 1. Use numbers, t, pi, e, + − * / ^, parentheses and sin, cos, abs, sqrt, min, max, clamp, pow.

Examples: t ^ 2, sin(t * pi / 2), clamp(t * 2, 0, 1). Formulas are parsed into a bounded numeric expression; they are never run as JavaScript.

Property targets

Choose Saved target (or New target), type a Channel name (default opacity), choose a Target kind and a Property, then click Save target. An action curve whose property is that channel name then drives the bound property.

TargetSuggested properties
materialcolor, opacity, roughness, metallic
camerafov, near, far, size, zoom
lightcolor, intensity, range, angle
nodevisible, uv.offset, uv.scale
customAny custom numeric property name

Advanced profile data shows the whole curve and target profile as JSON; Read profile loads it and Apply profile saves your edits.

Rendering and baking

Frames ZIP and WebM

  • Frames ZIP renders the current act, or the current clip, to scene-animation-frames.zip: numbered PNG frames at the clip FPS plus animation.json with FPS, frame count, duration and markers.
  • Record WebM records the viewport in real time to scene-animation.webm (VP9 or VP8). The file has no audio track.
  • Cancel render stops a running render.
  • Export format Viewport PNG saves the current view as scene-view.png.

One render covers at most 1,800 frames and 60 seconds, and a frame archive at most 256 MB. Create a clip or act before rendering.

Bakes

  • Bake current rig clip turns live constraints into keys (see above).
  • Converting arbitrary 3D meshes to a tile map (UV/color projection or surface voxels) happens in Formats & interchange.

Play in the full engine

With this editor active, the workspace ▶ Play button converts the scene into a native project and opens it in Game runtime. Skins, blend shapes and sampled constraint results travel through an embedded GLB. Transform animation and property animation (material color, opacity, roughness and metallic; light color, energy, range and angle; camera parameters and current camera; visibility; UV offset and scale; custom properties) are sampled for the engine at authored key times plus regular samples. Values between samples are approximated. Materials that use full-engine shader source preview in the viewport with a compatibility fallback; the status bar reads "Native materials: use Play for preview".

Import and export

Import accepts a scene, model or tile map together with its local sidecar files. Select the main file and its .bin, .mtl, .png and .jpg files in the same dialog. Save writes the full editor state as scene.scene3d.json. Export writes the chosen format.

FormatImportExport
Scene JSON (.json)YesYes (Save)
Isberg tile project (.isbtiles, .gbtiles)YesThrough Formats & interchange or MCP
glTF 2.0 / GLBTriangle meshes, normals, UVs, vertex colors, materials and textures, hierarchy, four-influence skins, TRS animation, cameras, punctual lights; embedded or local resources, sparse and interleaved accessors, triangle list/strip/fanSame, with embedded geometry and images; visibility/UV tracks, markers, acts and environment in application extras
OBJ + MTLPolygons (triangulated), negative indicesStatic snapshot of the evaluated visible scene with normals, UVs, vertex colors, MTL and texture sidecars
Collada 1.4.1 (.dae)Through Formats & interchangeGeometry, materials, hierarchy, cameras, lights, skin controllers and sampled transform clips; textures as sidecars
TMXFinite orthogonal maps with uncompressed CSV layersFloor tiles with one atlas; height levels become layers; other meshes are omitted and counted
Viewport PNGCurrent view
Limits. This editor's importer rejects remote URIs, unknown required glTF extensions, Draco-compressed geometry, missing resource files, compressed or base64 TMX layers and external TSX tilesets. Import those through Formats & interchange, which decodes them and sends the result here. Collada export has structural tests but has not been checked in every external importer.

Limits

ItemLimit
Vertices per mesh250,000
Scene objects / meshes10,000 each
Animation clips1,000
Keys per track100,000
Hierarchy depth256 levels
Bones per skin256
Influences per vertex4
Rig constraints256
Embedded texture96 MB, PNG or JPEG
Render job1,800 frames / 60 seconds; frame archive 256 MB
Editor undo60 steps
Limits. The software viewport uses simplified shading; WebGL is the primary preview. The brush and modeling gestures are independently implemented and are not certified identical to any other tile-modeling application.

MCP tools

The scene3d_* tools read and write scene JSON files directly and work with the desktop closed, except where noted. Existing output files need the tool's overwrite option where it has one.

Troubleshooting

"Compressed geometry must be decoded before importing."
The glTF uses Draco. Import it in Formats & interchange and click Open in 3D workspace.
"TMX layers must use uncompressed CSV encoding." or "External TSX references must be embedded before importing."
Import the map through Formats & interchange, which reads base64, compressed data and external TSX files.
"Unbind dependent skins before deleting bones."
Select the skinned mesh, click Unbind, then delete the bone.
"Bind the mesh before painting weights."
Select the mesh and click Bind all bones or Bind root first.
"IK chain must follow direct parent-child links." / "IK needs a valid contiguous joint chain."
Select the root bone and click Use selected bone chain. Two-bone IK needs exactly three joints.
"The construction plane is edge-on; orbit the view."
The brush plane is parallel to your view. Orbit, or choose another Plane.
"Render at most 1800 frames / 60 seconds per export."
Shorten the clip or act, or lower the clip FPS.
The renderer tag reads LOCAL SOFTWARE
WebGL could not start. Editing still works, with simplified shading; shader materials and shadows need WebGL.

Level & playtest

The Level & playtest editor builds game-specific blockouts and lets you walk through them. You place primitives and props, add pickups, checkpoints and goals, tune a movement controller, and playtest either in a local simulation or in the full bundled game engine.

Workspace layout

Open Level & playtest from the Tools palette. The sidebar is titled Level & playtest and holds, from top to bottom: templates and file buttons, game-style generation, level checks, the editor tool and placement controls, the Objects tree with object properties, components, Local playtest settings and the Import report. The viewport fills the rest. Its status line shows object, collider and import-warning counts while editing, and the player state while playtesting.

Coordinates are metres, Y up. The sidebar shows rotations in degrees; files and MCP store radians.

Templates and game-style layouts

Neutral templates

Choose a Template and click New from template. Every template has a 30 × 30 m ground, a Spawn marker and a directional Sun light.

TemplateAdds
blankNothing else.
platformerSix rising, alternating platforms.
landscapeA 9 × 9 field of terrain blocks at varying heights.
interiorFour walls and a table.

Game-style layouts

  1. Choose a Game style. Its description appears below the list.
  2. Enter a Generation seed (text, up to 120 characters), choose a Difficulty (relaxed, standard, challenging) and a Layout scale (0.75–2, steps of 0.25).
  3. Click Generate game layout. The layout replaces the level as one undoable edit, and Check level runs automatically.
Game styleLayoutCamera
Retro platformerRising jump platforms, safe landings, collectibles and a midpoint checkpoint.Third person
Fantasy RPGVillage square, main road and an exploration pickup; return to the entrance to finish.Third person
Dungeon crawlerConnected chambers, doorways, pillars, treasure and a key-gated exit.Top-down
Sci-fi shooterSymmetrical arena with cover, two flanking lanes and health pickups.First person
Survival horrorCorridor with side rooms, safe-room checkpoint, exit key, limited sprint and optional torch.First person
StealthAlternating sightline blockers, low cover, a crouch passage and a retrieve-and-return route.Third person
Cozy simulationHomestead, garden plots, paths, gathering pickups and a delivery goal.Third person
StrategyMirrored bases, resource sites and a central objective, for map inspection.Top-down
Racing circuitClosed course with three ordered checkpoints before the finish, for on-foot route inspection.Third person
Puzzle explorationThree chambers with required collectibles before the exit completes.Top-down

The same style, seed, difficulty and scale always produce the same level. Seeds vary scenery and cover; difficulty changes movement speed and trigger tolerance, and for the platformer, dungeon, shooter and stealth styles also route geometry or obstacle count. The recipe is saved in the level and restored when you open it.

Limits. Layouts are editable construction recipes, not finished game rules. Shooter combat and AI, stealth perception, strategy units and economy, vehicle physics and puzzle mechanisms are not included. Generated layouts turn off Full engine playtest, because the engine does not run their checkpoint and goal components (see Full engine playtest). The same recipes are also available through Game presets.

Placing and editing objects

Choose an Editor tool:

ToolBehavior
selectClick an object in the viewport or the Objects tree to select it.
placeClick a surface or the ground to place the Place item, snapped to Grid (default 1, minimum 0.1).
moveDrag the selected object on its horizontal plane, snapped to the grid.
eraseClick an object to delete it with its descendants.

Right-drag orbits the editor camera and the wheel zooms.

Placeable items

PlaceCreates
box1 m box.
wallBox 3 × 3 × 0.25 m.
floorBox 3 × 0.2 × 3 m.
pillarCylinder 0.6 × 3 × 0.6 m.
sphere1 m sphere.
markerNon-colliding marker, for spawns and references.
lightPoint light, intensity 1.5, range 12.
tableGroup with a top and four legs.
stairsGroup of five rising steps.

New items use the Color field. Tables and stairs are editable compound objects; their parts are child objects.

Object properties

With an object selected, edit Name, Parent, Position, Rotation °, Scale, Size, Color, Collidable and Visible, then click Apply transform / appearance. Positions are local to the parent. Hidden objects show as faint wireframes in the editor.

  • Duplicate copies the object and all its descendants, offset by one grid step on X.
  • Delete removes the object and its descendants.
  • Undo and Redo step through edits; playtesting never adds undo steps.
  • With the viewport focused: Ctrl+Z undoes, Ctrl+Shift+Z redoes, Delete deletes the selection.
  • Show collision shapes also displays invisible objects that collide.

Object types and indexed geometry

TypeUseCollides by default
box, sphere, cylinder, planePrimitives sized by Size.Yes
meshIndexed triangle geometry with normals, UVs, vertex colors and material data (color, roughness, metallic, texture), and optionally a shader material.Yes
groupParent for compound props.No
marker, light, cameraSpawn points, lighting, cameras.No
unresolvedPlaceholder for an external resource from an imported scene, drawn in purple.No

Mesh objects come from imported scenes and from 3D scenes, tile models or meshes sent to this editor through the shared asset shelf (see Projects). A level holds at most 10,000 objects.

Components and colliders

Select an object, choose a Component and click Apply component. Components make the object non-blocking.

ComponentBehavior in local playtest
health pickupRestores health by Pickup value (default 10), up to the maximum. Pickup radius 1 m.
stamina pickupRestores stamina by Pickup value, up to the maximum.
collectibleRecorded by object ID when collected.
checkpointActivates on approach (radius 1.5 m). Respawn returns here.
goalCompletes on approach (radius 1.5 m).
noneRemoves the component.

Checkpoints and goals accept a requires list of object IDs (collectibles to collect, checkpoints to activate or goals to complete first) and a radius of 0.1–40 m. Author these with level_object or in the level JSON. Collected objects hide for the current playtest only; a new playtest resets pickups and progress.

Colliders

Every collidable object, combined with its parents' transforms, becomes a conservative world-space axis-aligned box. Spheres, cylinders and rotated objects therefore collide as boxes. This is an inspection controller, not a rigid-body or per-triangle physics engine.

Movement controller settings

Set the sidebar fields and click Apply playtest settings. The Camera list chooses first, third or topdown. Further settings are available through level_settings and level_create.

SettingSidebar labelDefaultRange
GravityGravity240–200
Walk speedWalk speed40.1–100
Sprint speedSprint speed70.1–100
Crouch speedMCP only20.1–100
Player heightMCP only1.70.2–5
Crouch heightMCP only1.050.2–5, at most the player height
Player radiusMCP only0.280.05–2
Step-up heightStep height0.40–2
Jump speedMCP only70–30
JumpingJump enabledOn
Start in noclipMCP onlyOff
StaminaStamina enabledOn
Stamina maximum / drain / recoveryMCP only100 / 28 / 181–10,000 / 0–1,000 / 0–1,000
Health and fall damageHealth / fall damageOff
Health maximum / fall damage / safe fall speedMCP only100 / 4 / 111–10,000 / 0–1,000 / 0–100
Player torchPlayer torchOff

The controller moves the player's feet position in fixed substeps of at most 1/120 second, with gravity, horizontal sliding against walls, ceiling collision, grounded jumps, crouch height and step-up.

To set where the player starts, select a marker or object and click Spawn at selection; the spawn takes that object's world position.

Local playtest

  1. Clear Full engine playtest to use the local simulation.
  2. Choose a Camera and click ▶ Start playtest.
  3. Click the viewport to capture the mouse. Esc releases it.
  4. Click ■ Stop playtest to return to editing. The authored level is restored.
InputAction
W A S D or arrow keysMove relative to your heading.
Mouse (captured)Look.
ShiftSprint; uses stamina when stamina is on (not in noclip).
CToggle crouch. You cannot stand up under a low ceiling.
SpaceJump when jumping is on; rise in noclip.
Left CtrlDescend in noclip.
NToggle noclip. Leave noclip in free space, not inside a collider.
FToggle the player torch (when enabled).
RespawnReturn to the last checkpoint or the spawn, restoring health and stamina.

The status line shows the camera mode, Noclip/Grounded/Airborne, stamina, health (when on), collected items, checkpoints and goals. Falling below the world's lower bound returns you to the last checkpoint. Scripts attached to objects (see Script workspace) run during the local playtest; script errors appear in the Import report box.

Limits. Third-person camera obstruction avoidance, game AI, combat and networking are not part of the local controller.

Full engine playtest

With Full engine playtest checked (the default for new levels), ▶ Start playtest converts the level, its embedded indexed geometry, materials and supported scripts into a native project and runs it in the bundled engine in the Game runtime editor. The workspace ▶ Play button does the same while this editor is active. Native physics, the movement controller and GDScript run in the engine.

From Game runtime you can edit the native project in full (2D/3D scenes, resources, scripts, animation) and export playable builds (see Export). The original level document stays available; converting arbitrary engine nodes back into the simpler level format is not lossless.

Caution. The full engine does not implement this editor's checkpoint, goal and pickup components. Author equivalent gameplay scripts in the native project, or use the local playtest to test them.

Check level and handoff

Click Check level to run static authoring checks. The report lists object, checkpoint and goal counts and each issue with its severity.

  • Spawn blocked by a collider, or no supporting collider within five metres below the spawn.
  • Missing, inactive, self-referencing or cyclic trigger requirements.
  • Trigger centres inside colliders; unresolved source objects.
  • Object and collider counts above the review budgets (2,000 objects and 1,000 colliders by default; set others with level_preflight).
  • Shapes that collide as boxes in the local playtest; levels without a goal.

Export check report saves the report, with world bounds, recipe data, units (metres) and the Y-up convention, as <name>.preflight.json.

Limits. These are static checks. They do not compute a navmesh or prove jump clearance, route reachability, performance or release readiness. Test the routes in your target engine.

Importing .tscn scenes and projects

One text scene

Click Import .tscn and choose a text .tscn file under 16 MB. The source file is never changed, and no referenced file is fetched or run. Warnings appear under Import report.

A project folder

  1. Click Choose project folder and select the folder.
  2. Choose one of the listed .tscn scenes and click Import selected project scene.

Project import also resolves referenced GDScript, JavaScript and shader sources inside the folder and embeds them in the level. Each source file can be up to 1 MB and all sources together 16 MB. Paths that leave the project folder and URLs are refused.

Scene contentImport behavior
Node hierarchy and transformsParent paths, names and local transforms (Transform3D, legacy Transform, position, rotation, rotation degrees, scale). Untouched imported matrices stay exact.
Primitive meshesBox/Cube, Sphere, Cylinder and Plane. Capsules show as cylinders, with a warning.
Collision shapesBox, Sphere, Cylinder and Capsule as boxes. Area trigger shapes stay non-blocking, with a warning. Primitives without a shape get box colliders, with a warning; scenes with no local collision start in noclip.
CSGBox, sphere and cylinder dimensions. Boolean operations are not evaluated.
MaterialsSimple albedo color.
Lights and camerasPoint and directional lights, camera FOV and current state.
SpawnA CreativeSpawn, PlayerSpawn or Spawn marker, otherwise the active or first camera.
External resourcesKept as unresolved descriptors; external scene, mesh and shape instances get visible placeholder objects.
Scripts, shaders, unknown propertiesKept as data. A single-scene import never runs them; a project import embeds supported sources so they run only when you playtest.
Limits. Binary .scn files, compiled resources, native model formats and whole-project dependency resolution are not read. Animation players, skeletons, navigation, custom environments, CSG booleans and game-specific behavior are not executed. Editing an imported transform numerically rebuilds it from position, rotation and scale, so a sheared or mirrored original matrix can change.

Saving and file format

  • Save level writes <name>.level.json: a history-free level with objects, spawn, settings, embedded resources, warnings and source descriptors.
  • Open reads a .json or .level level file. Opening resets the editor's undo history.
  • The level, editor camera, selection and player start are also saved with the .isberg project.

MCP project files add bounded undo history (20 stored states, 128 MB per project) so level_history works across calls. level_export writes the history-free level.

MCP tools

Troubleshooting

Checkpoints and goals do nothing when I playtest
Full engine playtest is checked. Clear it to use the local playtest, or script the behavior in the native project.
The player falls through or starts inside geometry
Run Check level. Move the spawn with Spawn at selection onto a collidable surface, and check that the surface has Collidable set.
I cannot stand up after crouching
A ceiling is lower than the player height. Move out from under it, or press N for noclip.
"Expected a text .tscn scene under 16 MB."
The file is binary or too large. Save it as a text scene in the source engine.
"Resource escapes project root." / "Resources must remain inside the chosen project."
A referenced script or shader lies outside the chosen folder. Choose the project's root folder.
Imported objects appear purple
They are placeholders for unresolved external resources. See Import report and replace them with local geometry.

Formats & interchange

Formats & interchange imports local model, map and tile-project files with their sidecar resources, previews them, reports what could not be converted, and exports to other formats. Use it to bring FBX, Collada, Draco-compressed glTF, PLY, STL and every TMX projection into the 3D scene editor. All decoders, including the bundled WASM scene and Draco decoders, run inside Isberg Labs.

Workspace layout

Open Formats & interchange from the Tools palette. The editor has a toolbar (Import model + resources, Import folder, and a main-file list when several model files are selected), a preview on the left, an options column on the right, a diagnostics list and a status line.

The preview draws up to 20,000 triangles and 100,000 points. Drag to orbit it. The full scene is kept regardless of the preview limit; use the 3D scene editor for the main WebGL view.

Importing models

  1. Click Import model + resources and select the model file together with its sidecars (.bin, .mtl, .tsx, .png, .jpg), or click Import folder when the model refers to resources in subfolders.
  2. If you selected more than one model file, choose the main file in the list that appears.
  3. Read the summary (objects, vertices, triangles) and the diagnostics.

Resources are matched by their path relative to the main file. Nothing is fetched from a URL; missing textures produce diagnostics. Duplicate resource file names in different folders can be ambiguous and are reported.

Supported formats

FormatImportExport
glTF / GLBMeshes, materials, hierarchy, skins, clips, cameras, lights, morph targets (position, normal, tangent) and weight animation, Draco triangles and point clouds (including several buffers), standard POINTSGLB · embedded, glTF · embedded, with morphs and weight curves
FBXASCII 7.x and binary (before and from 7500) with compressed arrays: polygon meshes, normals, UVs, colors, materials, transforms, skin clusters, TRS animation curves, blend shapesFBX · mesh/rig/animation: ASCII 7.4 meshes, diffuse materials and texture sidecars, hierarchy, skin clusters, cameras, lights, TRS animation stacks
Collada (.dae)Triangle and polygon meshes, materials, hierarchy, skin controllers, matrix and TRS animation, morph dataCollada with skeletal controllers and sampled animation
OBJ + MTLGeometry, normals, UVs, vertex colors, materials, texturesOBJ + MTL, static evaluated snapshot
PLYASCII and binary little/big endian meshes and point clouds with positions, normals, colors and UVsPLY in the same three encodings
STLASCII and binary facetsSTL ASCII or binary
TMX / TSXSeveral atlases, image-collection tilesets, external TSX, XML/CSV/base64 data, gzip/zlib/Zstandard, all projections, infinite chunks, flip flags, height layers, object and group dataTMX · multi atlas with several image sidecars
Isberg tile project.isbtiles, .gbtiles; reference .croco, .crocotile, .c3dp (import only)Isberg tiles (.isbtiles)
Scene JSONFull platform sceneScene JSON; also Save scene JSON

Scene JSON keeps everything, including source-format metadata that no standard format can represent. Use it when you need a lossless copy.

glTF/GLB, Draco and morphs

  • Draco-compressed triangles and points are decoded by the bundled Draco WASM decoder, up to 250,000 vertices per geometry.
  • Required glTF extensions outside the supported set are kept with a diagnostic by default. The MCP option extensionPolicy:"error" rejects them instead.
  • Morph targets, default and per-node weights and weight animation (linear, step and cubic spline) are kept and survive glTF/GLB export.
  • Shader documents on materials are kept as application material extras.

Previewing and baking morphs

  1. Under Animation & morphs, choose a Clip (Rest pose for none) and click ▶ Preview, or set Time. An Act plays a choreography instead.
  2. Drag a target slider (−2 to 2) to try a weight by hand.
  3. Click Bake morph pose to turn the current weights into editable geometry. Base targets are kept, and repeating the bake always starts from the preserved base.

FBX and Collada

The FBX reader decodes ASCII and binary files (32-bit and 64-bit record headers, zlib-compressed arrays). It keeps large integer IDs exactly, connection records, animation and deformer data, global settings and unsupported objects as metadata. FBX export writes TRS clips as separate animation stacks, sampled at the requested FPS (1–240, default 30).

Collada import keeps the source XML, asset data and controller, effect and physics metadata. Collada export uses the same writer as the 3D scene editor.

Limits. FBX NURBS and patch tessellation, FBX constraints and IK, vendor shader graphs and encrypted or compressed proprietary extensions are not converted; they are kept as metadata. Reading the FBX record structure does not by itself mean the scene converted completely. ASCII FBX input is limited to 64 MB. No full FBX vendor parity is claimed.

PLY, STL and OBJ

  • PLY per-face UV seams become separate render vertices; concave planar polygons are triangulated by ear clipping (up to 4,096 corners). Unknown properties are kept as metadata.
  • STL binary detection uses the declared record size, so a binary header that begins with solid still reads correctly. Non-zero attribute words are kept as metadata.
  • For export, PLY/STL binary (default on) chooses binary, and PLY big endian chooses the byte order.
  • These static formats carry no bones or animation. Their export adds a .source.scene.json sidecar with the full editable scene unless you clear Embedded editable scene; reimporting with that sidecar restores the scene.

Point clouds

Point clouds from PLY, Draco and glTF POINTS stay real point primitives with their colors; they are not converted to triangles. Each cloud holds up to 250,000 points. The 3D scene editor draws them as points. Create, replace, read or remove clouds on a scene node with interchange_point_cloud.

TMX maps, projections and chunks

TMX import places map cells on the 3D floor, one quad per tile, with height layers. It reads orthogonal, isometric, staggered, hexagonal and oblique projections, finite layers and infinite chunks (including negative and empty ones), and gzip, zlib and Zstandard data. Hexagonal rotation flags rotate the quad; other flip flags remap UV corners.

Export options:

OptionValues
TMX datacsv, base64, xml
TMX projectionPreserve source, orthogonal, isometric, staggered, hexagonal, oblique
Preserve chunksKeep authored chunk rectangles (default on).
3D → TMXExisting floor tiles, UV/color projection, Surface voxels (see 3D to TMX bakes).

Group transforms are flattened into layer offsets on export, with a diagnostic; the original group data stays in the scene. Overlapping tiles in one cell and off-grid positions also produce diagnostics. A map is limited to one million cells.

Editable native tile projects

Isberg .isbtiles projects and reference .croco, .crocotile and .c3dp files import with their geometry, instances, action curves, UV frames, cameras, choreography, rigs, billboards and mirrors. When a scene has these records, the Native editable records panel appears:

  1. Choose a Domain: 3D action curves, UV frame sequence, Choreography or Billboard / mirror.
  2. Choose a Record and edit its JSON.
  3. Click Apply validated record. Playback and editable exports update.

Reference tile formats are import-only; export the full editable state as .isbtiles. For transforms and keyframes, use the 3D scene editor. See also Tile modeler.

Exporting

  1. Choose a Format under Export locally and set its options.
  2. For static formats, the current Clip, Act and Time choose the pose that is written.
  3. Click Export files. The main file and every sidecar are saved together.

Embedded editable scene (default on) adds a complete Isberg scene envelope to FBX, glTF/GLB and Collada files, and a .source.scene.json sidecar to OBJ, PLY and STL. Other programs read the standard content; Isberg Labs restores the full scene, including non-TRS tracks, shader source, point clouds, custom properties, rig, native and morph motion and choreography. Clear the option for a standards-only file.

Through MCP, useSceneExtension:false imports only the standard content, and mode:"original" exports the unchanged imported source bytes (without your edits).

3D to TMX bakes

A TMX map can hold arbitrary 3D only through an explicit bake. Set 3D → TMX:

ModeBehavior
Existing floor tilesWrites grid floor tiles as they are; fails if the scene has no grid tiles.
UV/color projectionRasterizes each triangle from above into cells, sampling UV textures, vertex colors and material color/opacity. With Retain overhang layers, surfaces stacked over the same cell become separate height layers; otherwise only the top surface is kept. Vertical faces are edge-on from above and are reported.
Surface voxelsTests triangles against cells and records surface occupancy; each height slice becomes a layer.
SettingDefaultRange
Cell size10.0001–10,000
Height step10.0001–10,000
Tile pixels161–128
Maximum cells (MCP maxCells)65,5361–262,144

Bakes sample the selected clip, act and time, including skins and morphs. Identical tile images share one atlas cell. The export writes the TMX, atlas images, the original .source.scene.json and a bake report; with Embedded editable scene on, the source scene is also embedded in a TMX property and restored when you reimport.

Limits. A bake is a quantized representation, not a conversion: it does not keep topology, rig, shaders or animation (the embedded or sidecar scene does). Bounds: 16 million atlas texels, 100 million triangle samples or voxel tests, atlas sides up to 8,192 pixels, decoded input images up to 16 million pixels. Use a coarser cell size, height step or tile size for large scenes.

Sending geometry to the 3D scene editor

Click Open in 3D workspace to send the imported scene, with all its metadata, to 3D scene & animation, where you can model, rig, animate and render it. Save scene JSON writes <name>.scene.json for later use. From MCP, interchange_open sends a stored scene to the running editor, and interchange_export_live exports what the 3D editor currently holds.

Inspection and diagnostics

The diagnostics list shows each parser message with a code, colored by severity (info, warning, error). Under Source metadata, check Show metadata to view the retained source-format records; the view shows the first 64 KB, and the full metadata stays in the scene JSON.

From MCP, interchange_info reports counts and diagnostics, with raw metadata only when includeMetadata is set, and interchange_fbx_metadata lists original FBX records without running anything.

Limits

ItemLimit
Input file, compressed input256 MB each
ASCII FBX64 MB
FBX recordsOne million nodes, 256 nesting levels
PLY, STL, Draco geometry250,000 vertices
Point cloud250,000 points
Polygon4,096 corners
TMX map or layerOne million cells
Preview20,000 triangles, 100,000 points

Format support is scoped to the domains listed in this chapter. It is not complete behavioral equivalence with every exporter or vendor extension.

MCP tools

Note. Since 0.19.1, interchange_info inspects raw .glb, .gltf, .fbx, .dae, .obj, .ply, .stl and .tmx files directly by importing them in memory. The other scene tools (interchange_export, interchange_open, interchange_morph, interchange_point_cloud) need a scene JSON: run interchange_import on the raw model first.

Existing files are only replaced when you pass overwrite; output plans are checked before any sidecar is written.

Troubleshooting

Textures are missing after import
Select the images together with the model, or use Import folder so relative paths resolve. Check the diagnostics for the missing names.
A scene tool reports that a raw model must be imported first
Run interchange_import and pass its output scene JSON to the tool.
"TMX needs grid floor tiles. Choose an explicit projection or voxel bake for arbitrary 3D."
Set 3D → TMX to UV/color projection or Surface voxels.
"No opaque texels were baked. Vertical-only geometry needs voxel mode."
The scene is made of walls seen edge-on from above. Use Surface voxels.
"Projected cell bounds exceed maxCells…" or "Bake exceeds 16 million texels…"
Increase Cell size or Height step, or lower Tile pixels.
"Reference tile formats are import-only. Export .isbtiles."
Choose Isberg tiles (.isbtiles) as the export format.
"Polygon cannot be triangulated (degenerate, self-intersecting or non-planar)."
Triangulate the model in its source program and export again.

Shader graph and Shader materials

Two editors author custom materials. Shader graph builds a material from typed visual nodes and compiles it to shader source. Shader materials edits that source by hand. Both render on your GPU, either in a standalone WebGL pipeline or in the full bundled game engine, and both report real compiler diagnostics.

Backends and languages

BackendLanguagesUse it for
Standalone WebGLSpatial / canvas source (a documented subset of the engine's shader_type spatial and canvas_item language), or Plain GLSL (GLSL 1 or GLSL 3 / WebGL 2)Materials that also render in the 3D scene and level viewports.
Full embedded engineComplete engine shader source: spatial, canvas, particles, sky and fogShaders that need the engine's compiler and renderer: screen and depth samplers, light(), includes, multipass and alpha depth prepass.

The full engine has two profiles: Web compatibility, which renders in an embedded web view, and Windows Forward+ Vulkan, which renders with the native Windows engine (optionally on Software Vulkan, on by default). Source is passed to the engine unchanged.

Note. All shader code is written by you; nothing is generated. The standalone translator is a new implementation of a supported subset, not the engine's own compiler.

Shader graph editor

Open Shader graph from the Tools palette. A new graph contains a Color node connected to the Material output. The editor has a node board, an inspector, and a full Shader materials preview panel on the right.

Toolbar

ControlEffect
Node type list + Add nodeAdds a node from the catalog.
Delete nodeDeletes the selected node. The material output cannot be deleted.
Disconnect inputDisconnects the input port you last clicked.
Undo, RedoGraph history, 60 steps.
Compile & previewCompiles the graph and renders it in the preview panel.
Save graph, Open graphSave or open <name>.shader-graph.json.
Export shaderSaves the generated source as <name>.gdshader.
New graphStarts a new default graph.
Kind listspatial or canvas_item.
Backend listStandalone WebGL or Full embedded engine.
UnshadedCompiles an unshaded material.
Zoom slider50–150 %.

Editing the graph

  • Drag a node's header to move it.
  • Click a node's output port, then an input port, to connect them (or click the input first, then the output).
  • Right-click an input port to disconnect it.
  • Select a node to edit it in the inspector: values, vector width (2–4), uniform name and type, texture, UV set, component index, and the default value of each unconnected input. The inspector also shows the last generated source.

Node types

Ports are typed. numeric inputs accept a float or a vector; dynamic outputs take the width of their inputs.

NodeInputs (default)OutputParameters
NumberfloatValue (1)
Vectorvec3Value (1, 1, 1), width 2–4
Colorvec4RGBA value (0.15, 0.75, 0.5, 1)
Uniformfloat or vectorName (amount), type float/vec2/vec3/vec4, default
Local textureuv (vec2)vec4Sampler name (surface_texture), embedded PNG/JPEG/WebP image; white when empty
UVvec2UV set 0 or 1
Timefloat
Surface normalvec3
View directionvec3Fragment stage only
Vertex positionvec3
Adda (0), b (0)dynamic
Subtracta (0), b (0)dynamic
Multiplya (1), b (1)dynamic
Dividea (0), b (1)dynamic
Powera (0), b (2)dynamic
Minimuma (0), b (1)dynamic
Maximuma (0), b (1)dynamic
Sinex (0)dynamic
Cosinex (0)dynamic
Absolutex (0)dynamic
Fractionx (0)dynamic
Floorx (0)dynamic
Normalizex (vec3)dynamic
Lengthx (vec3)float
Dot producta, b (vec3)float
Cross producta, b (vec3)vec3
Mixa (0), b (1), weight (0.5)dynamic
Clampx (0), min (0), max (1)dynamic
Smooth stepedge0 (0), edge1 (1), x (0)dynamic
Compose vectorx, y, z (0), w (1)vec2–vec4Width 2–4 (default 3)
Vector componentvector (vec4)floatComponent 0–3
Material outputcolor (vec3), alpha (1), roughness (0.6), metallic (0), emission (vec3), normal (vec3), vertexOffset (vec3)One per graph

For a spatial graph the output uses albedo, alpha, roughness, metallic, emission, the optional normal and the vertex offset. For a canvas graph it uses color, alpha and the vertex offset.

Compiling a graph

The compiler follows connected inputs, checks identifiers and vector widths, promotes scalars where needed, and builds separate vertex and fragment code. It produces engine-style shader source and a shader material document, which the preview panel then compiles on the GPU. Node parameters are never evaluated as expressions.

Limits. A graph has at most 512 nodes and 4,096 links, and exactly one material output. Cycles, missing nodes, invalid ports and conflicting uniform bindings fail with an error. Texture sampling feeding the vertex offset is rejected, because there is no texture-LOD node yet. Custom light processors, compute and other engine-only constructs are source-editor work in Shader materials.

Shader materials editor

Open Shader materials from the Tools palette. The left side holds the source editor; the right side holds the preview, uniforms and diagnostics.

ControlEffect
Language listSpatial / canvas source or Plain GLSL. The full engine always uses source.
Backend listStandalone WebGL or Full embedded engine.
Compile & applyChecks the source, compiles it on the GPU and updates the preview and uniform controls.
Save materialSaves <name>.shader.json.
Open material/sourceOpens a material .json or a .gdshader source file.
ExampleReplaces the document with the example for the current language.
Stage listFor Plain GLSL: GLSL vertex or GLSL fragment.
Add local include + include pathAdds an include file (see Includes).
Profile list, Software VulkanFull engine only: Web compatibility or Windows Forward+ Vulkan.
GLSL transparency, side list, GLSL version, Write depth, Test depthPlain GLSL settings: transparency, double/front/back side, GLSL 1 or GLSL 3 / WebGL 2, depth write and depth test.
Show generated GPU codeShows the translated vertex and fragment GLSL (or the original source for the full engine).

Tab in the source editor inserts two spaces.

Standalone source subset

DomainSupported
Shader kindsshader_type spatial, shader_type canvas_item
FunctionsParameterless void vertex() and void fragment(), plus reachable scalar/vector/matrix helper functions
Uniformsfloat, int, bool, vec2/3/4, ivec2/3/4, mat3/4, sampler2D; literal defaults, source-color, range, filter and repeat hints
GlobalsTyped constants and varyings
Vertex dataVERTEX, NORMAL, UV, UV2, COLOR, CUSTOM0–CUSTOM3
Fragment outputsALBEDO, ALPHA, ROUGHNESS, METALLIC, SPECULAR, EMISSION, AO, ALPHA_SCISSOR_THRESHOLD
Other built-insTIME, PI, TAU, E, VIEW, FRAGCOORD, FRONT_FACING, POINT_COORD, screen UV and pixel size, canvas TEXTURE and texture pixel size; model, view, inverse view, projection, model-view and normal matrices
Render modesBlend mix/add/subtract/multiply/premultiplied/disabled; depth draw opaque/always/never; depth test disabled; cull back/front/disabled; unshaded; wireframe; fog disabled; shadows_disabled with unshaded materials

Spatial shaders run inside the standard physically lit material, so lighting and shadows apply; unshaded and canvas programs use the basic material. Plain GLSL runs as a raw program with main() entry points; declare gb_time to receive the preview clock.

Limits. The standalone backend rejects, with an explicit error: screen and depth samplers, light and particle processors, includes and preprocessor directives, array/global/instance uniforms, flat interpolation, structs, cube and array samplers, two-pass alpha depth prepass and vertex lighting. Switch to Full embedded engine for these. Engine lighting and color-space curves, canvas pixel conventions and every material hint are not reproduced exactly.

Includes

Full-engine shaders can use local include files. Type a project-relative path in the include field (or leave it empty to use the file name), click Add local include and choose a .gdshaderinc, .inc or .glsl file. Absolute paths, .. traversal, remote resources and reserved project files are rejected; names are checked case-insensitively for collisions. A material holds up to 256 include files, 4 MiB in total.

Uniforms and textures

After compiling, Uniforms & local textures lists each declared uniform with a typed control:

  • Numbers: a number field, limited by any range hint.
  • Vectors: one field per component. Boolean vectors: one checkbox per component. Booleans: Enabled.
  • Arrays (full engine): a JSON editor, up to 4,096 values.
  • sampler2D: Choose local image embeds a PNG, JPEG or WebP; Clear returns to a white fallback texture. Canvas shaders also list TEXTURE.
  • Other sampler types in full-engine shaders are bound in the native project editor, not here.

In the full engine, the panel reads the running material's current defaults and edits it live, including sky materials. Matrix types, packed arrays and boolean-vector bit masks use the engine's value types.

Preview and output

  • Choose a preview shape (sphere, plane, box, torus) and a resolution (128, 256, 512 or 1024 px; default 512).
  • In Standalone WebGL, drag the preview to orbit, check Pause to stop the clock and set Time to choose a moment. The full engine keeps its own clock, so these controls are hidden there.
  • Export PNG saves shader-preview.png from the real GPU render. Publish preview adds it to the shared asset shelf.

Compiler diagnostics

Compiler diagnostics shows the result of the last compile as JSON. A source check (sourceValid) and actual GPU linking (gpuCompiled) are reported separately, with driver or engine logs, warnings and, for the full engine, the backend, engine version and (on Windows Forward+ Vulkan) renderer, driver, adapter and device. Errors are shown in red. A source that passes the structural check can still fail on the GPU; only gpuCompiled:true means it ran.

Using shaders on 3D and level materials

Attach a shader document to a 3D scene material with shader_scene_material, or move it between editors through the shared asset shelf. Standalone-compatible shaders run on the real mesh in the 3D scene viewport and follow the scene playhead's time; each object gets its own instance so matrices stay correct for shared materials. Levels run supported shader materials on their meshes during editing and playtesting (see Level & playtest).

Full-engine shader documents are kept on the material; the 3D viewport shows a compatibility fallback, and ▶ Play or a native export runs the original source. Standard interchange formats cannot run custom shader source; keep the Isberg scene or project for that.

Document format and limits

A shader material document stores its name, language (godot or glsl), execution (webgl or native), source or the two GLSL stages, includes, uniform values, embedded textures and settings (GLSL version, transparency, side, depth write, depth test). The editor also saves the chosen full-engine profile.

ItemLimit
Each source text256 KiB
Embedded textures32 per material, each under 8 MiB (PNG, JPEG or WebP)
Includes256 files, 4 MiB in total
Uniform arrays4,096 values
Graph512 nodes, 4,096 links
Limits. Volumetric fog needs Forward+ rendering and cannot run in the Web compatibility profile; you can still save and export the source. The engine rejects default values on uniform-array declarations; set array values as material parameters instead. GPU and driver limits apply.

MCP tools

GPU tools start the bundled platform when needed. shader_compile and shader_preview choose the full engine automatically for native documents.

Troubleshooting

sourceValid is true but gpuCompiled is false
The driver rejected the program. Read the logs under Compiler diagnostics; the structural check does not validate GLSL bodies.
"Screen/depth-buffer samplers require an explicit render pass and are unsupported." or "Preprocessor/include directives are not supported in the source-language subset."
Switch the backend to Full embedded engine.
"Full-engine mode executes source-language shaders; use WebGL mode for plain GLSL."
Plain GLSL runs only in Standalone WebGL.
"Volumetric fog execution requires Forward+ rendering…"
Choose the Windows Forward+ Vulkan profile.
"Texture sampling in vertex graphs requires an explicit native textureLod workflow."
Do not feed a Local texture node into vertexOffset; write that shader in Shader materials.
"Math vector inputs must have matching widths, or use scalars."
Use Vector component or Compose vector to match widths.
"Full source execution requires the bundled desktop runtime."
The full engine is only available in the desktop app, not in a detached editor page.

Avatar stage

Avatar stage rigs layered PNG sprites into an animated character that reacts to speaking and blinking. You build a layer hierarchy, add motion and spring physics, set up costumes, expressions and hotkeys, drive speech from your microphone, and show the result in a transparent output window for streaming or recording.

Workspace layout

Open Avatar stage from the Tools palette.

Toolbar
Avatar name, Add PNG, Demo rig, Open rig, Save rig, Export .isbavatar, Resolve sprite PNGs, Undo, Redo, Snapshot PNG, Record WebM and Stage view.
Monitor bar
Enable microphone, the device list with Refresh devices, a volume meter, Test speaking, Hold blink and Pause motion.
Left column
SPRITE LAYERS (back to front) with ↑, ↓, Duplicate and Remove; STAGE settings; Signal calibration / replay.
Stage (centre)
The animated avatar on a checkerboard. Drag a sprite to move it. The status line shows sprite count, speaking state, analysis volume, stage size, costume and recording state.
Right column
Sprite properties of the selected layer.

Demo rig loads a small example character with body, head, open and closed eyes, and quiet and talking mouths. Undo keeps 50 steps.

Sprite layers

Add PNG adds an image as a new layer at the stage centre. The image is embedded in the rig. Select a layer in the list or on the stage. ↑ moves it backward and ↓ forward; Duplicate copies it 20 px to the right; Remove deletes it and keeps its children in place at the root.

PropertyRange / defaultMeaning
Name, VisibleLayer label and visibility.
Parent (offsets are relative)No parentThe layer follows its parent; position is relative. Cycles are rejected.
Show whenAlwaysSee Speaking, blink and visibility gates.
Talk state, Blink state0–2, default 0Independent gates: 0 any, 1 silent/open, 2 speaking/closed.
Toggle hotkeyUp to 24 charactersKey that shows or hides the layer.
Costume membershipAll ten onCostumes 1–9 and 0 in which the layer appears.
Replace PNGSwaps the image and resets the sheet to one frame.
X position, Y positionPixelsPosition on the stage or relative to the parent.
Rotation (degrees)0Static rotation.
Z order−4096–4096, default 0Drawing order.
Image offset X/Y0Shifts the image relative to its pivot.
Flip X, Flip YOffMirror the image.
Clip child sprites to image alphaOffDescendants draw only where this image is opaque.
Ignore bounce effectsOffExcludes the layer from speech bounce.
Scale X/Y0.01–100, default 1
Pivot X/Y (0–1)Default 0.5Rotation and scale centre.
Opacity0–1, default 1

With the stage focused, arrow keys nudge the selected layer by 1 px (10 px with Shift). Esc during a drag cancels it.

Stage settings

Width and Height set the stage size (16–4096, default 960 × 640). Background / chroma sets a solid color; Transparent background clears it for transparent output.

Spritesheet animation

Under Spritesheet animation, set Columns and Rows to split the layer's image into a grid, then Frame count (up to columns × rows), Frames / second (0–120, default 8) and Starting frame (0–10000). Multi-row sheets are supported.

Speaking, blink and visibility gates

Show whenVisible
AlwaysAt all times.
Speaking / SilentWhile speaking / while silent.
Blinking / Eyes openDuring a blink / between blinks.
Speaking + blink / Silent + blinkWhile both conditions hold.

A layer is drawn only when its Show when condition, its Talk state and Blink state gates, its costume membership and any expression override all allow it. Test speaking (or Space) and Hold blink preview these states without a microphone.

Motion and physics

Choose a Timing mode under STAGE:

  • Seconds / spring simulation (default): sine motion in cycles per second and damped spring following.
  • Compatibility frame ticks: tick-based rules that follow a widely used PNG avatar application, at Compatibility FPS (1–240, default 60). Use this for imported native saves; set the FPS by hand because those saves do not store it.
FieldRange / defaultMode
Sine X distance, Sine Y distance−1000–1000; default 0 and 5 (0 for added PNGs)Both
Sine speed (cycles / sec)0–20, default 1; sets X and Y speed togetherSeconds
Sine phase (radians)Default 0; sets X and Y phase togetherSeconds
X sine speed, Y sine speed0–20, default 1Seconds
Rotation sway (degrees)−180–180, default 0Seconds
Speaking bounce0–500, default 10Seconds
Spring follow / jiggleOffSeconds
Spring stiffness, Spring damping1–1000 (90); 0–100 (16)Seconds
Drag amount0–1, default 0.35Seconds
X/Y sine frequency (radians / tick)Default 0Compatibility
Position drag (0 snaps)0–100, default 0Compatibility
Rotational drag−100–100, default 0Compatibility
Rotation limit minimum/maximum−360–360; default −180 and 180Compatibility
Stretch amount−100–100, default 0Compatibility
Native animation speed0–10000, default 0Compatibility

Stage-wide bounce: Speech bounce impulse (0–5000, default 250), Bounce gravity (1–10000, default 1000) and Bounce on costume change. Pause motion freezes the animation clock.

Costumes, expressions and hotkeys

Costumes

Choose the active costume in Costume (keys 1–0), or press 1–9 and 0 (costume 10). Each layer's Costume membership decides where it appears.

Expressions

  1. Arrange layer visibility, position, rotation, scale and opacity.
  2. Type a New expression name and click Capture expression.
  3. With that expression active, type a key in Expression hotkey.

Choose Base expression or a saved one in Expression. Remove expression deletes the active one.

Custom hotkeys

Under Custom hotkeys, enter a Key, an Action (costume, expression, toggle, speak, blink) and a Value (costume number, expression ID or sprite ID), then click Add binding. × removes a binding. Hotkeys work while the editor or the output window has keyboard focus, not globally.

Microphone analysis

Microphone capture starts only when you click Enable microphone. Audio is analyzed locally and never sent to the speakers. Choose an input in the device list (Refresh devices updates it).

SettingRange / defaultMeaning
Microphone analysisRMS / envelope (default) or Source spectrum / sensitivityHow volume is measured.
Speaking threshold (RMS)0.001–1, default 0.075RMS volume that counts as speaking.
Microphone gain0–20, default 1RMS mode.
Noise gate0–1, default 0RMS mode.
Speech release (seconds)0–5, default 0.15Hold time after speech stops.
Volume smoothing (seconds)0–2, default 0.05
Source FFT bins256, 512, 1024, 2048, 4096; default 256Spectrum mode.
Source volume limit0–2, default 0.075Spectrum volume that resets sensitivity to 1.
Source sensitivity threshold0–1, default 0.1Sensitivity above which the avatar speaks.
Echo cancellation, Noise suppression, Automatic gainOn, on, offCapture options.

Spectrum mode measures a stereo frequency-range maximum with a Hann window; mono input is duplicated to stereo. Sensitivity decays each frame and resets to 1 when the volume passes the limit. Changing the analysis mode or FFT size stops the microphone; enable it again.

Limits. Physical microphone response, operating-system capture processing and latency are not measured or certified. The output window always uses RMS volume, even when the rig uses spectrum analysis.

Signal calibration and replay

Open Signal calibration / replay in the left column.

  • Inspect signal state shows the random-generator state, the blink cursor and the sensitivity as JSON. Edit it and click Restore signal state to continue from that state; Reset signal state clears it.
  • Measure local PCM WAV reads a WAV file (up to 32 MiB, first 60 seconds) and reports its peak spectrum volume over complete blocks.
  • Use measured peak as source limit switches to spectrum analysis and sets Source volume limit to the measured peak (at most 2).

Project saves and the output window carry the signal state. Calibration uses the file's samples only; it does not measure device latency.

Output window, transparency and recording

Stage view opens a frameless, transparent Avatar output window with the same evaluated rig (when the desktop cannot open it, the stage goes full screen instead). Hover over the window to show its buttons: Enable microphone, a device list, Speak preview, Green screen (toggles a #00ff00 background) and Close. Drag the top bar to move it.

Output settingRange / default
Output / recording FPS1–240, default 60
Output scale0.1–8, default 1; the window is resized up to 4×
Smooth filteringOff (pixel-sharp)
Output always on topOn
Output click throughOff

For a transparent capture, click Transparent background. In the output window, Space toggles speaking, B toggles blink, and costume, expression, layer and custom hotkeys work as in the editor.

Snapshots and recording

Snapshot PNG saves the current frame as avatar-stage.png, with transparency when the background is transparent. Record WebM records the stage at the output FPS; click Stop recording to save avatar-animation.webm. Stop recording before moving the editor to another window.

Importing native avatar saves

  1. Click Open rig and choose an indexed JSON .save file from a PNG avatar application.
  2. If the save embeds its images, it opens directly. If it only stores image paths, a message asks you to resolve them: click Resolve sprite PNGs and select the PNG files. They are matched by file name. No path stored in the save is opened automatically.

The import keeps IDs, parents, positions and offsets, embedded PNGs, separate sine frequencies, drag, rotation limits, stretch, costume masks, animation fields, clipping, toggle keys and unknown fields. It creates a 960 × 640 rig with a transparent background, Compatibility frame ticks at 60 FPS and seeded native blinking. Set the stage size and FPS to match your source.

Limits. The .save format is import-only. Formula checks and file interoperability do not establish complete visual or behavioral parity with every version of the source application.

The .isbavatar file

Save rig and Export .isbavatar write <name>.isbavatar: a JSON rig with embedded PNG layers, transforms, motion, sheets, costumes, expressions, hotkeys, microphone, blink, output and physics settings, and the signal state. Open rig reads .isbavatar, legacy .gbavatar, .json, .avatar and .save files. The rig also saves with the .isberg project.

A rig holds up to 256 layers; each embedded PNG may be up to 64 MiB of encoded data, and the stage up to 4096 × 4096.

Keyboard shortcuts

KeyAction
1–9, 0Costume 1–9, 10
SpaceToggle test speaking
Arrow keys (Shift for 10 px)Nudge the selected layer (editor only)
Ctrl+Z / Ctrl+Shift+ZUndo / redo (editor only)
EscCancel a sprite drag
BToggle blink (output window only)
Expression, layer and custom hotkeysAs assigned

Shortcuts are ignored while a text field, number field or list has focus.

MCP tools

No avatar tool opens a microphone or audio device.

Troubleshooting

The avatar never speaks
Click Enable microphone and choose the right device. Watch the meter while you talk and lower Speaking threshold (RMS) (or Source volume limit and Source sensitivity threshold in spectrum mode). Test speaking confirms the layers respond.
"Microphone capture is unavailable in this runtime."
The editor cannot access a microphone. Use Test speaking or a hotkey with the speak action.
"Sprite … has no embedded image. Supply its local PNG…"
The save stores only image paths. Click Resolve sprite PNGs and select the images.
"Image dimensions disagree for …"
A layer's recorded size does not match its PNG. Replace the image with Replace PNG in the source rig.
A layer is missing on stage
Check Visible, Show when, Talk state, Blink state, its costume membership, the active expression and whether a clipping parent hides it.
Hotkeys do nothing
Click the stage or the output window to give it keyboard focus. Hotkeys are not global.

Audio: music, sound and ambience

Isberg Labs has four audio editors: Music & composition for multitrack music, Audio workshop for layered effects, ambience and recordings, Parameter sound for detailed parameter-based sound design, and Sound designer for quick seeded game sounds. All synthesis, mixing and processing runs on your computer, and every result is an editable document you can save, reopen and export as WAV.

Choosing an audio editor

Open each editor from the editor list in the studio shell (see Workspace).

EditorUse it forSaves asExports
Music & compositionPolyphonic synth, sampler and audio-clip tracks, piano roll, automation, DSP effect chains, tempo maps, MIDI.music.json compositionWAV (16/24-bit), MP3, Ogg Vorbis, FLAC, MIDI, synchronized stems ZIP
Audio workshopProcedural sound effects, evolving ambience, mixing and transforming recordings, a library of 264 editable presets.audio.json project (includes imported audio)WAV mix or one WAV per layer (16/24-bit, 44.1/48 kHz, stereo or mono)
Parameter soundParameter synthesis with ten wave shapes, moving control sources, modulators, ordered effects, EQ and compression.isbsound document, GBS1: setup codeWAV (native 8/16-bit, 22.05/44.1 kHz), FLAC, Ogg Vorbis, MP3
Sound designerFast seeded retro effects from one oscillator with envelope, pitch, filter and delay controlssound-settings.jsonMono 16-bit WAV

All four editors share the Game style & delivery panel for genre presets, event banks, game-ready WAV delivery and (in Music & composition) synchronized stems. Editor states are saved with your .isberg project (see Projects).

Music & composition

Compose layered music from synthesizer, sampler and audio-clip tracks. Notes that overlap in time play together (polyphony), and any number of tracks play at once. Rendering runs in a separate local worker so the editor stays responsive, and you can cancel it at any time.

Toolbar and composition settings

ControlWhat it doesRange / options
Sketch list + Load sketchReplaces the composition with an editable starting sketch (Bass and Melody synth tracks). Sketches are synthesis settings, not recorded sample packs.Arcade, Bright (default), Comedy, Interface, Ambient, Orchestral, Electronic, Suspense
New compositionStarts an empty composition with one synth track named Instrument.
Undo / RedoSteps through up to 40 editing snapshots.
▶ Render & playRenders the whole composition and plays it. The overview waveform and status line show duration, track count, sample rate and peak.
StopStops playback and any render in progress.
Cancel renderCancels a render or stem export in progress.
TempoBase tempo in BPM (sets the tempo point at beat 0).20–400
BeatsComposition length in beats.0.25–1200 in the field
RateOutput sample rate.22050, 44100, 48000 Hz
Tail · secExtra time after the last beat so releases, delays and reverb tails can finish.0–10 s

Any edit discards the previous render; the status line reads "Composition changed. Render to hear the result." Drop audio files anywhere on the editor to add each one as a clip track.

Tracks and instruments

The track list on the left shows each track's name, kind and note count, with Mute and Solo buttons. Click a track to select it. Use + Synth, + Sampler (choose an audio file; it becomes a looping sampler with one starter note) or + Clip (choose an audio file to place on the timeline), plus Duplicate and Remove. Import sample / IR embeds an audio file without creating a track, for use as a sampler source, convolution impulse response or vocoder modulator; the count of embedded samples is shown below it. Samples are embedded in the composition, and stereo samples keep both channels.

Edit the selected track under Selected track:

FieldMeaningRange / default
NameTrack nameText
InstrumentTrack kindsynth, sampler, clip
OscillatorSynth waveformsine, square, saw, triangle, noise (deterministic)
SampleEmbedded sample used by sampler and clip tracksAny embedded sample
GainTrack level0–4 (default 0.7)
PanStereo position; constant-power for mono sources, unity-gain balance for stereo sources−1 to +1
Pitch · semitonesTransposition. For samples and clips, pitch changes without changing duration.−24 to +24
Stretch durationChanges sample duration without changing pitch (phase vocoder). 2 doubles the duration; it does not mean double speed.0.25–4
Sampler rootMIDI note at which the sample plays at its original pitch0–127 (default 60)
Clip start · beatWhere a clip starts on the timeline0–1200 beats
Trim start · sec / Trim end · secPortion of the sample used; leave Trim end empty to use the whole sample0–180 s
ReversePlays the sample backwardsOn/off
Loop sampleLoops sampler notes and clipsOn/off
Attack · sec, Decay · sec, Release · secEnvelope stage times0–5 s (defaults 0.005, 0.08, 0.12)
Sustain levelEnvelope sustain level0–1 (default 0.7)

Piano roll

The piano roll shows two octaves (24 rows) starting at Lowest note (0–104, default 48). Choose a tool:

  • Draw notes: click an empty cell to add a note one snap step long (velocity 0.8). Drag a note to move it; drag its right edge to change its length.
  • Erase: click a note to delete it.
  • Move / resize: drag notes without adding new ones.

Right-click a note to delete it with any tool. Snap sets the grid step in beats (0.125, 0.25 default, 0.5, 1), so the grid also works as a step sequencer. For exact values, select a note and edit Note (MIDI number), Beat, Length and Velocity (0–1), then press Apply note; Delete note removes it. Clip tracks show a single block instead of notes; change their position and length in the track fields.

Automation

In the Automation panel choose a Parameter and a Curve, then click the lane to add points (horizontal position is musical time in beats, vertical is value). Right-click near a point to remove it. Clear curve removes the whole curve for that parameter. Each point's curve type applies to the segment that follows it.

ParameterLane range
gain0–2
pan−1 to +1
cutoff20–20000 Hz (low-pass)
pitch−24 to +24 semitones

Curve types: linear, step (holds the value until the next point) and exponential (used when both values are positive). A curve holds up to 4096 points.

Local effect chain

Each track has an ordered chain of up to 16 effects. Choose an Effect type and press Add effect, fill in its fields, then press Add to track. In the chain list, Edit loads an effect into the form (press Update effect to commit) and Remove deletes it.

EffectFields (default)Ranges
filterlowpass (8000), highpass (20)low-pass 20–48000 Hz; high-pass 0–48000 Hz
delaytime (0.25), mix (0.35), feedback (0.3)time 0.001–2 s; mix 0–1; feedback 0–0.9
convolutionmix (0.4), normalize (off), Impulse samplemix 0–1; impulse response up to 65,536 frames, mono or stereo
spectrallowHz (0), highHz (20000), formant (0), freeze (off), freezeAt (0.2)low/high 0–48000 Hz; formant −24 to +24 semitones; freezeAt 0–180 s
vocoderbands (16), lowHz (80), highHz (8000), attack (0.005), release (0.06), Voice/modulatorbands 4–48 (logarithmic); low/high 20–48000 Hz; attack/release 0.0001–5 s

The spectral effect band-limits the spectrum, shifts the spectral envelope (a formant effect, not a voice model) and can freeze the spectrum from a chosen time. The vocoder transfers the band envelopes of the modulator sample onto the track. Convolution uses the full impulse response; a stereo impulse response turns mono input into stereo.

MIDI timing and performance

Import MIDI opens .mid/.midi files (Standard MIDI File format 0, 1 or 2, PPQ or SMPTE timing, up to 16 MiB and 128 tracks). Imported tracks use local instrument timbres chosen by program number, and channel 10 uses local percussion. Export MIDI saves composition.mid. An unchanged import exports its original bytes exactly; after edits, SysEx, lyrics, unknown metadata and chunks are still preserved.

The MIDI timing and performance panel shows whether the document is a native composition or an imported SMF, and offers:

Independent sequence
Shown for format-2 files; selects which independent pattern plays.
Channel · 1–16, Program · 0–127, Use program timbre
The selected track's MIDI channel and program. Setting a program also inserts a program event at beat 0 and switches the track to its program timbre.
Tempo beat, BPM, Set tempo point
Adds or replaces a tempo-map point. Listed points have Remove buttons. The tempo map drives note, automation and clip timing and the render length.
Event, Beat, CC / note, Value, Add event
Adds a channel event to the selected track: cc (controller 0–127, value 0–127), pitchBend (−8192 to 8191), program (0–127), channelPressure (0–127) or polyPressure (note and value 0–127).
Time signature JSON + Apply time signatures JSON
Edit entries of the form {"beat":0,"numerator":4,"denominator":4}; numerator 1–255, denominator a power of two.

During rendering, CC64 sustain, CC66 sostenuto, CC67 soft pedal, CC7 volume, CC11 expression, CC10 pan, CC1 modulation, CC74 brightness, CC120 all sound off, CC121 reset, CC123–127 all notes off, pitch bend, RPN pitch-bend range and fine/coarse tuning, and channel/poly pressure affect playback. Every other controller is kept for export even when it has no audible effect. External sound-bank patches and device SysEx patch loading are not emulated.

Rendering, saving and export

  • Export WAV renders and saves using the Format beside it: wav16, wav24, or the compressed ogg, flac and mp3 (encoded by the bundled codec).
  • Export synchronized stems ZIP renders the mix and every audible track; see Synchronized stems.
  • Save composition writes <name>.music.json; Open composition reopens a .json composition.

Imported audio is decoded locally (WAV, or any format the built-in browser decoder supports). Render output is stereo; peak normalization is available through MCP.

Note. Composition files store times in beats (notes, automation, clip start, length) and envelope, trim and delay times in seconds. Pitch and formant use semitones; frequencies use Hz; velocity and sustain use 0–1; pan uses −1 to +1.
Limits. Up to 2048 tracks, 8192 notes and 16 effects per track, and 128 embedded samples. Rendered and processed audio is limited to 17,280,000 frames per channel (180 seconds at 96 kHz). Impulse responses are limited to 65,536 frames; trim or downsample longer ones first. Phase-vocoder stretching and pitch shifting can smear transients and change very short samples.

Audio workshop

The Audio workshop builds sounds from up to 12 procedural layers or imported recordings, with an effects rack, waveform and spectrum views, and a searchable library. Three tools share one window; choose them in the top bar:

ToolPanel titleUse
01 Sound effectsSOUND EFFECT DESIGNERShort sounds from synthesized layers (0.2–20 s)
02 AmbienceAMBIENT SOUNDTRACK CREATOREvolving atmosphere layers (0.2–120 s)
03 TransformIMPORT & TRANSFORMMixing and transforming up to 12 imported recordings or microphone takes

Each tool keeps its own current project. The sidebar has Start from scratch, Open project and Save project. Undo (Ctrl+Z) and Redo (Ctrl+Shift+Z) sit beside Export audio.

Sound library

The library holds 264 editable presets: 136 sound effects in 19 categories (Interface, Arcade, Percussion, Musical, Nature, Comedy, Cinematic, Ambient, Creatures, Impacts, Drones, Tension, Textures, Mechanical, Electrical, Organic, Footsteps, Tonal, Weather), 24 ambience Environments, 24 Transformations (effect chains for imported audio) and 80 Game styles entries (ten game styles × eight events, see Game audio presets).

  • Search with the Find a sound… box (press / to focus it) and filter by category in the sidebar.
  • In the library grid, ▶ previews a sound without replacing your project; click the sound name to load it (Undo restores the previous project). ☆ marks a favorite, and ☆ Favorites shows only favorites.
  • Sort by Featured first, Name A–Z or Shortest first. Show more sounds ↓ loads more cards.
  • Loading a Transformations preset applies its effect chain and pitch to your current imported tracks.

Shaping controls

The right panel (Shape the sound, Shape the atmosphere or Edit selected track) previews changes live.

ToolControlRange
Sound effectsDuration0.2–20 s
Darkness0–100%
Roughness0–100%
Movement0–100%
⚄ Create a variationRandomizes the seed, layer frequencies, pans and pulse spacing, darkness and movement (undoable)
AmbienceDuration, Darkness, Event density, Movement, ⚄ Create a variationDuration 0.2–120 s; others 0–100%
Transform (selected track)Pitch−24 to +24 semitones
Playback speed0.25–2×
Darkness0–100% (whole mix)
Trim start (s), Trim end (s), ⇄ Reverse, Hear originalTrim within the source length (minimum 0.02 s kept)

In Transform, pitch and speed change together, like tape playback: raising the pitch also shortens the track.

Layers and mix tracks

The lower-left panel lists Sound layers, Atmosphere layers or Mix tracks (up to 12). Each row has a timeline strip, a volume slider (0–1.5), M (mute), S (solo), ⧉ (duplicate) and × (remove). Use + Add layer in Sound effects and Ambience. Select a row to edit it below the list.

FieldApplies toRange / options
SourceSynthesized layerssine, triangle, square, sawtooth, growl, impact, noise, drone, pulse, metal, creak, whisper, wind, rain, spark, bell, step, heartbeat, riser, alarm, radio, water, glitch, string
Frequency (Hz)Synthesized layers15–8000
PanAll−1 (left) to +1 (right)
Attack (s) / Release (s)Synthesized layers0.002–10
Fade in (s) / Fade out (s)Imported tracks0.002–10
Start offset (s)AllLayers: 0 to the scene length; tracks: 0–179.9
Layer length (%)Synthesized layers1–100% of the scene
Pulse / event spacingSynthesized layers0.1–20
PlaybackSynthesized layersContinuous, Sparse events
Track nameImported tracksUp to 70 characters
RepeatImported tracksPlay once, Loop to mix end

In Transform, the mix toolbar sets Mix length (s) (0.1–180) and offers Fit tracks (length fits the tracks), Start together (all tracks start at 0) and Play in sequence (tracks play one after another, up to the 3-minute limit). Audio after the mix end is cut off.

Effects rack

Effects apply to the full mix. Each has an on/off toggle and an amount from 0 to 100%: Reverb, Echo, Distortion, Low-pass (off at 100%), High-pass, Bit crush, Tremolo and Stereo width. Reset sets Low-pass to 100%, Stereo width to 70% and all others to 0.

Importing, recording and URLs

In 03 Transform, press Import audio or drop files on the import zone. Select several files together; each becomes a track. ● Record records from your microphone (audio only) until you press ■ Stop recording or 3 minutes pass, then adds the take as a track named My recording.

Limits. WAV, MP3 and other formats the built-in decoder supports; 12 tracks; 50 MB per file; each file 0.02 seconds to 3 minutes; 3-minute mix; 96 MB of decoded audio per project. Files that fail are listed in the import message and skipped.

Sounds load from files on your computer only; there is no URL import. Download a sound with your browser first, then use Import audio or drop the file.

Waveform, spectrum and transport

  • Waveform / Spectrum switch the display. Badges show SYNTHESIZED or IMPORTED, STEREO and 48 kHz preview rate. Click the waveform to seek.
  • Transport: ▶/Ⅱ play/pause (Space), ■ stop all (Esc), ↻ loop playback, elapsed/total time.
  • VOL sets listening volume (0–1, default 0.65) with a level meter. Listening volume never affects exports.

Export and project files

Export audio opens Export your sound:

FieldOptions
File nameText (sanitized to lowercase letters, digits, - and _)
Sample rate48,000 Hz, 44,100 Hz
Bit depth24-bit PCM WAV, 16-bit PCM WAV
ChannelsStereo, Mono
OutputFull mix, Separate layer WAVs (one file per audible layer, respecting mute/solo)
Normalize peak to −1 dBOn by default
Blend loop boundary (100 ms)Crossfades the end into the start for a seamless loop (shortens the file by the blend length)

Press ↓ Download WAV; closing the dialog cancels an export in progress. Save project writes <name>.audio.json containing all three tools and any imported audio; Open project restores it (up to 160 MB). The workshop also keeps your current project and favorites in the app's local storage between sessions; use Save project for a portable backup.

Shortcuts: Space play/pause, Esc stop all, Ctrl+Z undo, Ctrl+Shift+Z redo, / search. Press ? for in-app help.

Parameter sound

Parameter sound is a detailed manual sound editor. Every control is editable and saved, and each render computes fresh samples from the parameters. Rendering runs in a separate worker; Cancel render stops it immediately, even during an effect pass.

Toolbar, presets and variations

ControlWhat it does
Preset list + Load presetcoin, zap, boom, jump, powerup, fall, impact, blip, random. With Calibrated generators selected, loading runs that numerical generator (random runs full randomization); generators reset the synth controls but keep effects, mastering, noise seed and reset intervals. With Studio sketches selected, loading uses the original sketch catalog.
New soundResets the sound (generator reset, or a default sound in sketch mode).
Undo / RedoUp to 60 steps; includes variation and DSP-session state.
Render & play, Stop, Cancel render, Loop playbackRender and listen; the waveform and status show duration, sample count, rate and peak.
Calibrated generators / Studio sketchesChooses which preset family Load preset and New sound use.
Randomize controlsRandomizes the whole model, including effect routing and enabled states.
Mutate controlsChanges selected continuous controls slightly.
Variation seed + Reset variation streamSeed 0–4294967295. Randomize and mutate continue one saved random stream, so the same seed and sequence of operations reproduces the same results.
Retain DSP session, Reset DSP session, Processed source frames, Replay frame cursorSee DSP sessions.

Control sources

Most controls are control sources that can move during the sound. Each has Value (0–1 in the field), Speed / sec (−1 to +1) and Reset · seconds (blank = off) (0–99999, restarts the motion periodically). The pitch source also has Acceleration and Jerk (−1 to +1). Saved documents accept −1 to +1 for value, speed, acceleration and jerk.

Oscillator & pitch

  • Name and Noise seed (0–999,999,999).
  • Wave shape, one of ten: sine, whistle, tangent (clipped tangent), cubic, triangle, saw, square (half-height square), white, pink and brown (seeded noise).
  • Invert waveform flips polarity.
  • Pitch · normalized control: a control source on a nonlinear musical scale. The editor shows the resulting Initial pitch in Hz.

Amplitude envelope

Attack · seconds, Decay · seconds, Sustain · seconds and Release · seconds (each 0–5 s), plus Attack peak and Sustain level (0–1). The stages run attack → decay → sustain duration → release. Saved documents store the times as 0–1 at five seconds per unit.

Modulators, harmony and arpeggio

GroupControls
Vibrato, Tremolo, Ring modulation, Wah filterEnabled, Wave shape (sine, cubic, triangle, saw, square, white), Invert modulation, Frequency control and Depth control (control sources)
HarmonyEnabled, Octave overtone count, Overtone falloff
Frequency modulationEnabled, Strength, Tone ratio
ArpeggioEnabled, Pattern (up, down, both, random), Step rate (control source), Octave range control and Note count control (0–1), and key checkboxes C, C♯, D, D♯, E, F, F♯, G, G♯, A, A♯, B, C+

Effects and routing

  • Digital texture: Enabled, Bit crush, Sample skip.
  • Delay: Enabled, Delay length, Echo strength (feedback delay).
  • Effect routing: the order of tremolo, ring, wah, digital and delay. Use ↑/↓ to reorder. Enabled effects feed the EQ and compression.

Mastering & output

Low EQ, Mid EQ, High EQ (three-band EQ), Compression and Output gain, each 0–1. Sample rate: 44100 or 22050 Hz. PCM bits: 16 or 8. The output is mono.

DSP sessions

With Retain DSP session on (the default for new sounds), effect state carries from one render to the next the way the native editor behaves: the physical effect route, the previous wah block and delay initialization are kept. Reordering effects changes the authored order; Apply saved routing (shown under Effect routing) applies it to the session's active route. Reset DSP session starts a fresh session. Processed source frames (0–2,646,000 in steps of 2048) with Replay frame cursor restores the session's input history at a chosen point for reproducible renders. Turn the option off for stateless renders; applying a game preset turns it off.

Documents, setup codes and legacy import

  • Save sound and Export .isbsound both save an .isbsound document with all controls, names, variation stream and DSP session.
  • Open sound accepts .isbsound, .gbsound, .json and legacy compact .cpt setup files (version 2 only; unknown versions are rejected).
  • Compressed setup code: Create code writes an Isberg code starting with GBS1:; Apply code loads a GBS1: code or a legacy compressed setup code.
  • Export audio with the format list: wav (native 8- or 16-bit PCM at the chosen rate; 16-bit uses the native 32000 sample scale), or flac, ogg, mp3 through the bundled codec.
Note. Generators and variations construct editable synthesis parameters; they never select recordings. Saved random continuation does not recover a hidden random state from another application.

Sound designer

Sound designer synthesizes one mono sound from a seeded oscillator with envelope, pitch and filter motion and a delay. The same settings and seed always produce the same sound. Every slider change re-renders immediately.

Preset buttons: Pickup, Laser, Explosion, Powerup, Hit, Jump, Blip, Random; clicking one loads it with the current Seed and plays it. Toolbar: ▶ Play sound, Stop, Variation (next seed of the same preset or game event; custom sounds get a small seeded pitch change), Seed (0–4294967295), Export WAV, Save settings, Load settings. Recent sounds keeps the last 12 sounds; click one to restore and play it.

GroupControlSlider rangeSaved-settings limit
OscillatorWaveformsine, square, saw, triangle, noise, pink
Sample rate8000, 11025, 22050, 44100, 48000 Hz8000–96000
Frequency · Hz20–40001 Hz to just under half the sample rate
Volume0–1
Pulse width0.02–0.980.01–0.99
Pulse width sweep−1 to +1−2 to +2
EnvelopeAttack · seconds0–20–5
Hold · seconds0–20–5
Decay · seconds0–20–5
Release · seconds0–20–5
Sustain level0–1
Retrigger · Hz0–400–100
Pitch & modulationPitch slide · semitones/s−60 to +60±120
Pitch acceleration−60 to +60±120
Vibrato · cents0–5000–1200
Vibrato rate · Hz0–300–100
Arpeggio rate · Hz0.5–400.01–100
Arpeggio · semitone offsetsComma-separated, e.g. 0, 7, 12; each −48 to +48Up to 64 steps
Filters & effectsLow-pass · Hz20–22000Up to half the sample rate
Low-pass sweep−4 to +4 (octaves per second)±8
High-pass · Hz0–10000
High-pass sweep−4 to +4±8
Distortion0–100–20
Bit depth2–162–24
Sample hold1–321–64
Delay · seconds0.01–10.001–2
Delay mix0–0.80–0.85
Delay feedback0–0.8

The sound lasts attack + hold + decay + release, plus a delay tail when the delay mix is above zero. Export WAV saves mono 16-bit PCM named sound-<preset>-<seed>.wav. Save settings writes sound-settings.json; Load settings reopens it.

Game audio presets and delivery

Every audio editor has a Game style & delivery panel. Choose a style and seed, then press Apply game sound (or Apply game music in Music & composition). Selecting an option alone never replaces your document, and the result stays fully editable. The Game presets action in the studio toolbar applies the same recipes (see Game presets).

ControlOptions (default first where stated)
Game styleRetro platformer, Fantasy RPG, Dungeon crawler, Sci-fi shooter, Survival horror, Stealth, Cozy simulation, Strategy, Racing, Puzzle
Event (sound editors only)interface, pickup, jump, impact, weapon, footstep, ambience, victory
Seed0–4294967295 (default 1). The same seed reproduces the same settings.
PCM bits24, 16
Delivery Hz48000, 44100, 22050, 96000
Peak dBFS−3, −6, −1
Taper loop edgesOff by default
Variations3, 1, 2, 4, 8

Styles change the oscillator, pitch motion, harmonic intervals, envelopes, filtering and space. Music presets create three editable tracks, Foundation, Exploration and Action pulse, with a genre-specific tempo, notes, rhythm and timbre.

Export game WAV + recipe

Renders your current sound or composition and saves game-audio-delivery.zip with sound.wav and recipe.json (the editable source, processing settings, loop bounds and measurements). Processing removes the DC offset, converts the sample rate when needed, applies short edge fades (3 ms) and scales the sample peak to the chosen headroom. Taper loop edges uses a 10 ms taper without changing the frame count and writes the loop bounds into the recipe; it avoids a click but can cause a small level dip at the boundary, and it does not beat-match or make the sound periodic. A higher bit depth does not restore detail already quantized by Parameter sound's 8-bit output.

Export event bank ZIP

Creates 1–8 variations of each of the eight events for the selected style and saves <style>-sound-bank.zip. WAVs are stored as <style>/<event>/<event>_01.wav and so on, with manifest.json recording exact synthesis settings, seeds, frame and channel counts, sample peak and RMS. The bank renders the style's event recipes; it does not vary your current custom sound.

Synchronized stems

In Music & composition, Export synchronized stems ZIP saves game-music-stems.zip with mix.wav, one 24-bit WAV per audible track under stems/, composition.json and a timing manifest.json. All files share the same start, sample rate and frame count. Mute and solo are honored, and no per-stem normalization is applied. Cancel render stops the export.

Limits. Stem export supports up to 64 audible tracks and a predicted 96 MiB of WAV data; archives are limited to 128 MiB. Summing the stems may not exactly reconstruct a mix that clips. Peak and RMS readings are sample-peak values, not LUFS or true-peak measurements. These presets are starting points; mastering and listening checks are up to you.

Audio formats

EditorImportsExports
Music & compositionWAV (8/16/24/32-bit PCM or 32-bit float, mono/stereo) and other formats the built-in decoder reads; MIDI SMF 0/1/2; .music.jsonWAV 16/24-bit stereo; MP3, Ogg Vorbis, FLAC; MIDI; stems ZIP; .music.json
Audio workshopWAV, MP3 and other decoder-supported formats; microphone recording; .audio.jsonWAV 16/24-bit, 44.1/48 kHz, stereo/mono, mix or per-layer; .audio.json
Parameter sound.isbsound, .gbsound, .json, legacy .cpt; GBS1: and legacy setup codesWAV 8/16-bit, 22.05/44.1 kHz mono; FLAC, Ogg Vorbis, MP3; .isbsound; GBS1: codes
Sound designersound-settings.jsonMono 16-bit WAV; sound-settings.json
All (Game style & delivery)Delivery ZIP (WAV + recipe), event bank ZIP

Compressed export uses the codec bundled with Isberg Labs; no separately installed encoder is needed. The codec accepts WAV input under 256 MB.

MCP tools

These tools work on files directly, without opening the editors. See MCP for setup.

Music & composition

  • music_project: create, inspect or update a composition (sketch preset, tempo 20–400, beats, sample rate, master 0–2, normalize, tail 0–10 s).
  • music_track: add, update, delete or list synth, sampler and clip tracks with all instrument settings.
  • music_notes: add, replace, list, update or delete piano-roll notes.
  • music_sample: import a WAV as an embedded sample, list or delete samples.
  • music_automation: set, clear or inspect gain, pan, cutoff and pitch curves.
  • music_effect: add, update, list or delete filter, delay, convolution, spectral and vocoder effects.
  • music_midi: import or export SMF 0/1/2, inspect metadata, select a format-2 sequence.
  • music_timing: inspect or replace the tempo map and time signatures.
  • music_events: list, append, replace or delete CC, program, pitch-bend and pressure events.
  • music_render: render mono/stereo 16/24-bit WAV, optional normalization and per-track stems.
  • audio_render_job: start, poll, list or cancel background music renders and PCM jobs.
  • audio_process_pcm: time-stretch, pitch-shift, spectral, convolution, vocoder, resample or reverse a WAV directly.

Audio workshop

  • audio_catalog: search the bundled effect, ambience and transformation presets.
  • audio_render: render a preset or custom layered scene to WAV, with up to 12 local WAV sources and optional loop blending (0–4 s).

Parameter sound

Sound designer, encoding and presets

Troubleshooting

"Composition changed. Render to hear the result."
Any edit discards the last render. Press ▶ Render & play again.
"Bundled codec is unavailable."
Compressed export needs the codec in the portable folder. Export WAV, or re-extract the full portable release.
"Impulse response is limited to 65,536 frames; trim or downsample it."
Use a shorter impulse response, or trim it on its track before using it.
"Render exceeds 17,280,000 frames; reduce duration or sample rate."
Shorten the composition, reduce the tail or choose a lower Rate.
"Stem export exceeds 96 MiB; shorten the composition or lower its sample rate."
Mute tracks you do not need, shorten the piece or lower the rate.
Audio workshop skips a file
The import message lists the reason: over 50 MB, shorter than 0.02 s or longer than 3 minutes, unsupported or damaged audio, or the 96 MB project limit. Save and reopen the project to release memory from removed tracks.
"Re-import the original recording to restore this project."
The workshop's local audio storage was cleared. Open a saved .audio.json project, which contains the audio, or import the recordings again.
"Recording is unavailable here." / "Microphone could not be opened"
Check that a microphone is connected and allowed in Windows privacy settings. You can still import audio files.
Parameter sound: "Expected a compact native parameter setup (180–65536 bytes)."
The file is not a legacy .cpt setup, or it is a version this importer rejects.

RPG Creator

RPG Creator is a complete workspace for building, testing and shipping role-playing games: layered tile maps with autotiles, a full database, event pages and commands, original character sheets, embedded resources, JavaScript plugins, turn-based and time-progress battles, and exports to playable HTML, portable Windows and macOS games. Projects save as one .isbrpg document.

Starting a project

Open RPG Creator from the editor list. It opens with the editable starter adventure, Meadow of Beginnings: two maps (Meadow and Old Ruins), a village guide who gives gold, a Moss Slime battle, a gate that transfers to the ruins and an item cache. The top bar has:

ButtonWhat it does
NewReplaces the project with a blank one: one 20 × 15 Meadow map with no events and a minimal database (one actor, class, item, weapon, armor, enemy, troop, animation, tileset and common event; three skills; two states).
Harbor demoOpens the bundled Autotile Harbor project: animated tiles, a plugin journal, configurable commands, side-view actors, particle effects and time-progress (TPB wait) battles.
OpenOpens .isbrpg, legacy .gbrpg or .json documents up to 384 MiB.
SaveSaves the project as <game title>.isbrpg.
Import RPG projectImports a project folder; see Importing RPG projects.
Undo / RedoUp to 40 steps of project history.
▶ PlaytestOpens the Playtest tab with a fresh game.

The workspace has eight tabs: Maps, Database, Events, Characters, Resources, Plugins, Playtest and Deployment. The status bar at the bottom reports every action and error. The editor state, including playtest save slots, is also saved with your .isberg project.

An .isbrpg document is JSON. It contains the maps, database, events, embedded resources, plugin source and saved character recipes. Source copies of the two examples, Meadow.isbrpg and Autotile-Harbor.isbrpg (with exported .html versions), are in resources\app\examples\rpg\ in the portable folder.

Maps, layers and autotiles

The Maps tab has the map list on the left, the map canvas in the center and Map properties on the right. Click a map in Project maps to open it (child maps are indented); + New map adds a 24 × 18 map.

Layers and brushes

Choose a layer, brush and zoom in the map toolbar:

ControlOptions
LayerLayer 1–Layer 4 (tile IDs 0–8191), Shadows (0–15), Regions (0–255). Shadow and region values are drawn as numbers on the map.
BrushPencil (drag to paint), Rectangle, Ellipse (drag between two corners), Flood fill, Event placement (click a cell to create or select an event and open it in Events), Player start (click to set the starting map and position)
Zoom50%, 75%, 88% (default), 100%, 150%. Large maps are previewed at a smaller tile size.
GridShows or hides the cell grid

Right-click a cell to pick its value on the current layer (eyedropper). The status bar shows the map, cell coordinates, layer and current tile while you move over the canvas.

Tile palette and tileset sheets

Until you assign tileset images, the Tile palette offers a procedural preview set: Erase, Grass, Path, Water, Stone, Tree and Roof. Type any value in Tile / region ID to paint a specific ID. After you import tileset PNGs and assign them (see Resources), a Tileset sheet list shows the real tiles of each sheet:

SheetTile IDsContents
A12048 onward, 16 autotile kinds × 48 shapesAnimated water and waterfall autotiles
A22816 onward, 32 kindsFloor (ground) autotiles
A34352 onward, 32 kindsRoof and building-wall autotiles
A45888 onward, 48 kindsWall-top and wall-side autotiles
A51536–1663128 plain ground tiles
B, C, D, E0–255, 256–511, 512–767, 768–1023Upper-layer objects (256 tiles each; tile 0 is empty)

Autotiles reconnect to their neighbors as you paint: each cell is built from quarter tiles chosen by its surrounding cells, including floor, wall and waterfall shapes, passage layering, table edges and shadows. Tileset tile size can be 16, 24, 32 or 48 pixels (set in the System record; default 48).

Map properties

FieldMeaning
Name, Display nameEditor name and the name shown in game
Width, Height, Resize map1–256 cells each. Resizing is refused if an event or the player start would fall outside the map.
Parent mapPlaces the map under another map in the list (cycles are refused)
TilesetTileset record used by the map
Selected tile propertiesPassage and terrain flags for the current tile (layers 1–4); for an autotile the change applies to all 48 shapes: Block down, Block left, Block right, Block up, Above characters, Ladder, Bush, Counter / table, Damage floor, Block boat, Block ship, Block airship landing
LoopNone, Vertical, Horizontal, Both
Encounter stepsSteps between random encounters (default 30)
Edit eventsOpens the Events tab for this map
Advanced map propertiesAll other map fields as JSON (autoplay BGM/BGS, battlebacks, parallax and its scrolling, encounter list, dashing, note); press Apply properties
Delete mapRemoves the map (not available for the last map, or while the player starts there)
Limits. Up to 999 maps, each 1–256 × 256 cells, and 4,194,304 cells in total across all maps. Each map stores six planes: four tile layers, shadows and regions.

Database

The Database tab lists the record types on the left. Select a record from Records on the right (use Filter records to search by ID or name; + Add record copies the current record as a new one). The center shows editable fields for every simple value, plus the complete record as JSON for nested data such as traits, damage, effects, parameters and notes. Edit either, then press Apply record.

Record typeMain fields
ActorsName, nickname, profile, class, initial and maximum level, starting equipment, character/face/battler images, traits, note
ClassesName, parameter curves, experience curve, learnable skills by level, traits, note
SkillsName, description, icon, skill type, MP/TP cost, TP gain, scope, occasion, speed, success rate, repeats, hit type, damage formula, effects, animation, required weapon types, battle messages
ItemsName, description, icon, item type, price, consumable, scope, occasion, speed, success rate, repeats, hit type, damage, effects, animation
WeaponsName, description, icon, weapon type, equipment type, price, parameters, traits, animation
ArmorsName, description, icon, armor type, equipment type, price, parameters, traits
EnemiesName, battler image and hue, parameters, EXP, gold, drop items, action patterns, traits
TroopsName, member enemies and positions, battle event pages
StatesName, icon, restriction, priority, motion, overlay, minimum/maximum turns, auto-removal timing, removal at battle end, by restriction, by damage or by walking, messages, traits
AnimationsName, effect file, display type, offset, rotation, scale, speed, flash and sound timings
TilesetsName, mode, assigned A1–E sheet images, per-tile flags, note
CommonEventsName, trigger, switch, command list
SystemGame title, currency, start map and position, starting party, battle system, options (side view, display TP, followers, autosave and more), title and battle images, music and sound effects, switch and variable names, element, skill, weapon, armor and equipment types, terms (basic, parameters, commands, messages), window tone and advanced screen settings

When System is selected, the right panel also offers Battle system (Turn based, TPB active, TPB wait) and Tile size (16, 24, 32, 48). Record IDs run from 1 to 9999.

Events and commands

The Events tab lists the selected map's events under Map events. Use + Add event, or place events with the Event placement brush on the map. Find event text searches every event on every map. Each event has a Name, X and Y, and 1–99 pages (Page 1, + Page copies the current page).

Page settings

SettingOptions
TriggerAction button, Player touch, Event touch, Autorun, Parallel
Page conditionsSwitch 1, Switch 2, Variable (with Variable minimum), Self switch (a letter, default A), Item, Actor; each with an enabled checkbox and an ID. All enabled conditions must pass; the highest matching page runs.
PriorityBelow characters, Same as characters, Above characters
OptionswalkAnime, stepAnime, directionFix, through

Edits to a page are collected in the Complete event JSON box; press Apply event to commit them, and apply before switching pages. Delete event removes the event.

Command editor

The command list shows each command indented by branch level. Click a command to load it into the Command editor, which has Command (code and name), Branch indent (0–99) and Command parameters (JSON). Use Insert command (after the selected command), Update selected and Remove selected. Quick message with Append message adds a Show Text command. When enabled plugins declare commands, Insert plugin command lets you pick a Plugin command, fill in its arguments and Append plugin command (command 357). A page or common event holds up to 10,000 commands.

All 122 commands below are run by the playtest and exported player. Script and plugin commands run only in the isolated browser player.

GroupCommands (code)
MessagesShow Text (101, lines 401), Show Choices (102; When Choice 402, When Cancel 403, End Choices 404), Input Number (103), Select Item (104), Scrolling Text (105, lines 405), Comment (108, lines 408)
Flow controlConditional Branch (111; Else 411, End Branch 412), Loop (112; Repeat Above 413), Break Loop (113), Exit Event (115), Common Event (117), Label (118), Jump to Label (119), End (0)
Game progressControl Switches (121), Control Variables (122), Control Self Switch (123), Control Timer (124)
PartyChange Gold (125), Change Items (126), Change Weapons (127), Change Armors (128), Change Party Member (129)
System settingsChange Battle BGM (132), Change Victory ME (133), Change Save Access (134), Change Menu Access (135), Change Encounter (136), Change Formation Access (137), Change Defeat ME (139), Change Vehicle BGM (140)
MovementTransfer Player (201), Set Vehicle Location (202), Set Event Location (203), Scroll Map (204), Set Movement Route (205; Movement Command 505), Get On/Off Vehicle (206)
CharacterChange Transparency (211), Show Animation (212), Show Balloon Icon (213), Erase Event (214), Change Followers (216), Gather Followers (217)
ScreenFadeout Screen (221), Fadein Screen (222), Tint Screen (223), Flash Screen (224), Shake Screen (225), Wait (230)
Pictures and weatherShow Picture (231), Move Picture (232), Rotate Picture (233), Tint Picture (234), Erase Picture (235), Set Weather Effect (236)
Audio and videoPlay BGM (241), Fadeout BGM (242), Save BGM (243), Replay BGM (244), Play BGS (245), Fadeout BGS (246), Play ME (249), Play SE (250), Stop SE (251), Play Movie (261)
MapChange Map Name Display (281), Change Tileset (282), Change Battle Back (283), Change Parallax (284), Get Location Info (285)
SceneBattle Processing (301; If Win 601, If Escape 602, If Lose 603, End Battle 604), Shop Processing (302; Shop Good 605), Name Input Processing (303), Open Menu (351), Open Save (352), Game Over (353), Return to Title (354)
ActorChange HP (311), Change MP (312), Change TP (326), Change State (313), Recover All (314), Change EXP (315), Change Level (316), Change Parameter (317), Change Skill (318), Change Equipment (319), Change Name (320), Change Class (321), Change Actor Images (322), Change Vehicle Image (323), Change Nickname (324), Change Profile (325)
BattleChange Enemy HP (331), Change Enemy MP (332), Change Enemy TP (342), Change Enemy State (333), Enemy Recover All (334), Enemy Appear (335), Enemy Transform (336), Show Battle Animation (337), Force Action (339), Abort Battle (340)
AdvancedScript (355, lines 655), Legacy Plugin Command (356), Plugin Command (357)

Supported behavior includes conditional pages, flow control and common events, messages with speaker names, choices and number/item input, inventory and shops, transfers, move routes, autonomous movement, interpolated followers and gathering, camera scrolling, vehicle boarding and airship altitude, and troop events.

Character sheets

The Characters tab is an original character generator. Pick a Saved characters entry or + New character, then set name and the colors skin, hair, outfit, accent and eyes, Hair style (Short, Long, Spiky) and Accessory (None, Cape, Hat). Randomize picks new hair, outfit and eye colors and a hair style. Press Save character to store the recipe in the project.

OutputSheet size (px)
Walking sheet144 × 192
Face portrait144 × 144
Damage sheet144 × 48
Side-view battler576 × 384

Component layers

Combine the procedural base with your own artwork. Choose an Output, press Import PNG components and select transparent PNG sheets of exactly that output's size (up to 4 MiB each). Each output has its own layers, drawn from top to bottom of the list (the last layer is in front). For each component set Layer name, Visible, Offset X, Offset Y (−4096 to 4096), Opacity (0–1), and Recolor enabled with a Recolor color (replaces visible pixels with one color, keeping transparency). Reorder with Move earlier and Move later; Remove layer deletes it. Clear Include procedural base to use only your components.

Export SVG and Export PNG save the composition shown in the preview. Saved recipes keep source pixels, order, visibility, offsets, opacity and recolor.

Limits. Up to 64 component layers and 32 MiB of component data per character. Stock generator artwork from other tools is not supplied.

Embedded resources

The Resources tab (Resource manager) embeds graphics, audio, movies, effects and fonts in the project. Choose a Resource folder and press Import resources; a file with the same path replaces the existing one. The list shows each resource with an image preview or audio player and a Remove button, plus the total count and size.

Folders: img/tilesets, img/characters, img/faces, img/pictures, img/parallaxes, img/enemies, img/sv_enemies, img/sv_actors, img/battlebacks1, img/battlebacks2, img/system, audio/bgm, audio/bgs, audio/me, audio/se, movies, effects, fonts. Recognized types include PNG, JPEG, WebP and SVG images; Ogg, M4A, MP3 and WAV audio; WebM and MP4 movies; Effekseer effect files (.efkefc, .efk) with their dependencies; and TTF, OTF, WOFF and WOFF2 fonts. Full project import keeps the original folder names.

Once tileset PNGs are imported, Assign map tileset sheets lets you pick the image for A1, A2, A3, A4, A5, B, C, D and E of the current map's tileset.

Resources cover tile sheets, characters, faces, icons, window skins, battlebacks and side-view sheets; actor motions, balloons, damage and collapse effects, picture movement, tint and rotation, and screen transitions. Cell-based animations and offline Effekseer effects play imported animation resources, including distortion and custom material or model dependencies. Movies wait for playback to finish, and audio honors loop metadata.

Limits. Each resource up to 64 MiB; 256 MiB and 20,000 files per project.

Battles

Choose the battle system in Database → System → Battle system:

Turn based
Every actor chooses a command, then all battlers act in order of speed. Queued turns collect every action slot and evaluate automatic party skills.
TPB active
Time-progress battle: each battler's gauge charges continuously and acts when full. Gauges keep charging while you choose commands.
TPB wait
Time-progress battle in which charging pauses while a command is being entered or actors are waiting for input.

Battles support traits, parameter and resistance rates, hit, evasion, critical, counter, reflection and substitution, drains, repeats, scopes, states, buffs, regeneration, costs, equipment and experience. Actions wait for the battle log, movement and animations before each hit. Guard uses the authored guard skill, its states and its costs. Prepared actions, remaining hits and casting progress are kept in saves. The battle windows provide command, target, status and log windows, with side-view actors when the System option is on.

Note. Time-progress battles use a sqrt(agility) + 1 speed with party-base normalization, 240-frame (active) and 60-frame (wait) charge references, a random initial half charge, and sqrt(max(0, -skill.speed)) / speed casting time. These are compatibility assumptions for imported projects.

Plugins

RPG Creator runs JavaScript plugins in an isolated player. Enabled plugins execute from top to bottom during playtest and in exported games. Imported JavaScript has no access to the studio, your files or the network: the playtest runs in a sandboxed frame, and exported players block outside network requests and host privileges. Importing a file never runs it, and the plugin editor reads source only as text.

Plugin editor

  1. Open the Plugins tab and press Import JavaScript…. Choose one or more .js files (up to 16 MiB each; names must be unique). You can also import plugins with a whole project folder.
  2. Select a plugin in the list (☑ enabled, ☐ disabled, with its load position). The page shows its description and author.
  3. Use Enabled, Move up, Move down and Remove plugin to control what runs and in which order. Warnings appear when a required base plugin is missing or disabled, when the order conflicts with the plugin's declared dependencies, or when its source is missing.
  4. Edit Parameters and press Apply parameters.
  5. Read Event commands to see the commands the plugin declares, their arguments and defaults. Insert them from the Events tab with Insert plugin command (command 357).
  6. Expand Plugin help for the author's help text, or JavaScript source to edit the code and press Apply source. Start a new playtest to run the changes.

The editor reads the plugin's header annotations: description, author, help, URL and target, @param parameters, @command commands with @arg arguments, structures, and @base, @orderAfter and @orderBefore dependencies. Parameter controls follow the declared type:

Parameter typeControl
boolean, selectDrop-down (ON/OFF labels or the declared options)
actor, class, skill, item, weapon, armor, enemy, troop, state, animation, tileset, common_event, switch, variableDrop-down of the project's records, with 0: None
numberNumber field honoring min, max and decimals
multiline_stringMulti-line text
Arrays and struct<…>JSON text (validated when you apply)
fileText field showing the asset directory
string and othersText field

Bundled example plugins

Nine unmodified MIT-licensed example plugins are in resources\app\examples\rpg\plugins\ with their original license and source checksums: AltKeyPatch.js (separates Alt and Ctrl input), AutoRaise.js (automatic revival), BugfixWindowWithBlend.js (window open/close blend fix), CharacterFreeze.js (stops characters), DebugEnemyActionTable.js (enemy action table debugging), EventMovableLimitation.js (limits event movement range), ParallaxesNonBlur.js (removes blur from non-scrolling parallaxes), ScreenRotation.js (screen rotation) and StateDuringAction.js (states during actions). They are optional; import them like any plugin. Credits are in Third-party notices.

Available plugin API

The player provides a finite, tested plugin API. Method presence is not a promise that every plugin works; see Compatibility limits.

AreaAvailable
Display classesBitmap, Sprite, TilingSprite, Tilemap, ColorFilter, ScreenSprite, Stage, Window, WindowLayer, on a bundled PIXI renderer with a real Application and Ticker
NamespacesGraphics (game loop, tick handler, resize, loading and error screens, frame count, Effekseer integration), Input (pressed/triggered/repeated/long-pressed, key and gamepad mappers, dir4/dir8), TouchInput (press, click, cancel, move, hover, release, wheel, coordinates)
Game objectsGame_Temp, Game_System, Game_Timer, Game_Message, Game_Switches, Game_Variables, Game_SelfSwitches, Game_Screen, Game_Picture, Game_Item, Game_Action, Game_ActionResult, Game_BattlerBase, Game_Battler, Game_Actor, Game_Enemy, Game_Actors, Game_Unit, Game_Party, Game_Troop, Game_Map, Game_CharacterBase, Game_Character, Game_Player, Game_Follower, Game_Followers, Game_Vehicle, Game_Event, Game_Interpreter
ScenesScene_Base, Scene_Boot, Scene_Title, Scene_Map, Scene_Battle, Scene_Menu and the menu scenes (Scene_Item, Scene_Skill, Scene_Equip, Scene_Status, Scene_Options), Scene_File/Scene_Save/Scene_Load, Scene_Shop, Scene_Name, Scene_Message, Scene_GameEnd, Scene_Gameover
WindowsWindow_Base, Window_Scrollable, Window_Selectable, Window_Command and their menu, item, skill, equipment, status, options, save-file, title, message, choice, number, event-item, name-input, shop and battle windows (about 50 window classes in all)
Sprites and spritesetsSpriteset_Base, Spriteset_Map, Spriteset_Battle, Sprite_Character, Sprite_Battler, Sprite_Actor, Sprite_Enemy, Sprite_Weapon, Sprite_Damage, Sprite_StateIcon, Sprite_StateOverlay, Sprite_Gauge, Sprite_Picture, Sprite_Balloon, Sprite_Name, Sprite_Timer, Sprite_Destination, Sprite_Clickable, Sprite_Button
Managers and utilitiesSceneManager, BattleManager, DataManager, PluginManager, ImageManager, AudioManager, SoundManager, TextManager, ColorManager, ConfigManager, FontManager, JsonEx, Utils
Global data$dataActors, $dataClasses, $dataSkills, $dataItems, $dataWeapons, $dataArmors, $dataEnemies, $dataTroops, $dataStates, $dataAnimations, $dataTilesets, $dataCommonEvents, $dataSystem, $dataMap, $dataMapInfos, and the $game… objects such as $gameParty, $gameActors, $gameMap, $gamePlayer, $gameSwitches, $gameVariables, $gameSelfSwitches, $gameScreen, $gameTemp, $gameSystem, $gameMessage, $gameTimer, $gameTroop
Shared helpersPluginManagerEx-style typed nested parameters and command arguments, live text escapes for variables, actors, party members and currency, metadata lookup with typed values, script names and imported command dispatch. These are implemented locally; the upstream base plugin is not bundled.

Plugins can alias battler, action, lifecycle and reward methods; damage formula, critical, variance, guard and item-effect hooks; enemy conditions, ratings and action lists; forced actions; event page selection and refresh; map, character and interpreter updates; child interpreters and custom waits; scene and window callbacks; sprite, bitmap and filter factories; and screen tint, picture and zoom updates. Plugin fields are kept in saves, plugin class instances are restored without rerunning their constructors, and actor copies stay independent.

Display timing

The player advances the game on a fixed logical clock of 60 updates per second, independent of the display refresh rate: the same elapsed second at 30, 60, 120 or 144 Hz produces 60 updates of input, simulation, scene children and frame counts. Redrawing never advances the game. The loop runs through the public Graphics tick and SceneManager hooks, so plugins that stop, resume or change the repeat count of updates control the real loop. Screen tint, picture motion and zoom follow the same clock, and paused progress is kept in saves. Imported map tiles share one scene graph with characters and plugin children, so tileset and scroll hooks, layer priority, screen rotation and zoom affect what you see.

Playtest

Press ▶ Playtest or open the Playtest tab. The Game preview runs the same player as exported games, with game menus, plugins, battle windows and the animation renderer, inside an isolated frame. Studio buttons: Restart (reloads the project into a new game), Save session and Load session (keep one playtest state in the project). Leaving the tab closes the preview; returning or pressing Restart starts a new game with your latest edits, and in-game save slots are restored.

Player controls

  • Move with the arrow keys or W A S D, or the on-screen ← ↑ ↓ → buttons. Enter or Space interacts and advances messages. In battle menus, Esc returns to the main command list.
  • Player toolbar: Save and Load (a quick save for this game), Restart, Menu (opens the game menu) and Title (returns to the title screen).
  • Game menus: title (New Game, Continue, Options), items, skills, equipment with comparison, status, formation, options, save/load, shops with quantity and status, name input, game over, paged and scrolling messages with speaker names, attached choice, number and item input.
  • Options: Always Dash, Command Remember, Touch UI (on/off), and BGM, BGS, ME and SE volume (default 100%).

The status line under the player reports runtime diagnostics, such as an unsupported command or a missing resource.

MCP playtests (rpg_playtest) run a separate local session that can move, interact, advance events, choose, enter input, use shops, battle, change switches and variables, save and load. They do not execute project JavaScript (scripts and plugins); those commands report diagnostics. Up to 16 sessions run per MCP server process; a session reads the project when it starts, so restart it after editing, and save explicitly before the server stops.

Saves and save recovery

The in-game save screen offers Autosave plus File 1–File 20. When the System autosave option is on, the game autosaves to the Autosave slot after changing maps and after battles. Saving is refused ("Saving is disabled here.") when an event has turned save access off.

Where you playWhere saves live
Studio playtestIn the RPG Creator editor state, saved with your .isberg project
Playable HTML and web folderThe browser's local storage for that page
Windows gameThe Data folder beside the game's .exe; moving the whole folder keeps the saves
macOS gameData beside the application when writable; otherwise the app's Application Support folder

Save recovery: a save is checked before it replaces the running game. If a save is malformed or refers to a map, party member or position that no longer exists ("Invalid RPG save or missing map." / "Invalid RPG save state."), loading fails and your current game and map stay as they were.

Importing RPG projects

Import RPG project reads a project folder in the RPG Maker MZ layout. RPG Creator is an independent implementation; it does not guarantee that every imported project behaves as it does in another tool.

  1. Press Import RPG project and choose either the project folder or its data folder. The selection must contain exactly one System.json.
  2. If you chose the project folder, RPG Creator imports data/*.json, js/plugins.js and the plugin sources in js/plugins/, and every file under img, audio, movies, effects and fonts. If you chose the data folder, it imports the JSON alone.
  3. Review the Compatibility report in Deployment, then save the result as .isbrpg.

Import requires System.json and MapInfos.json plus each listed MapNNN.json. Native field names, extra JSON records and extra data files are preserved for export. Encrypted resources (.png_, .ogg_, .m4a_) are decrypted when System.json contains the project's encryption key. The plugin list is parsed without running it; enabled plugins without source are flagged. The MCP tool also accepts a .rmmzproject marker file in place of the folder.

Limits. Data JSON up to 64 MiB and 4096 files; resources up to 64 MiB each, 256 MiB and 20,000 files in total. Imports never copy third-party runtimes or artwork.

Exporting project data

Export project ZIP (Deployment) writes the database and maps as data/*.json, imported resources, js/plugins.js, plugin sources and a metadata sidecar (data/GamebenchMetadata.json) that keeps characters, plugins and resource details. With MCP (rpg_export_project) you can also export to a folder, export data only, and encrypt images (img/**/*.png) and audio (.ogg, .m4a) with a 32-character hexadecimal project key. Resource exports contain your project materials only; they do not include a player, editor or runtime.

Delivery

The Deployment tab (Build your adventure) saves and packages your game. Turn on Exclude unused resources to leave out resources nothing references; files are kept whenever enabled plugins or scripts could build resource names at runtime, and effect dependencies stay together.

ButtonOutput
Save RPG projectThe editable .isbrpg document
Export playable HTMLOne self-contained .html file with the player, plugin host and all resources. Open it in a current browser. Saves use browser local storage.
Export project ZIPProject data, resources and plugins for interchange (see above)
Export Windows gameA portable Windows folder: <Game title>.exe with the bundled desktop runtime, the game under resources\app\game, EXPORT.json and README.txt. No installation and no installed Node.js are needed. Keep the folder together; saves and the browser profile live in Data beside the executable. Network access and host JavaScript privileges are disabled.
Export macOS game<Game title>-arm64.zip (Mac architecture: Apple silicon) or -x64.zip (Intel), built from a pinned, checksum-verified runtime that keeps executable modes and framework links. Extract the ZIP on a Mac and run Prepare Game.command, which applies a local ad-hoc signature and launches the app. For public distribution, sign and notarize with your own Apple identity.
Export web folderA standalone folder with index.html, the project source, EXPORT.json and README.txt
  1. For the Windows, macOS and web exports, type an Empty export folder or press Choose folder.
  2. For macOS, choose the Mac architecture.
  3. Press the export button. The status bar shows "Game package:" and the path of the result.

Every game export embeds the same player, enabled plugins and resources you used in playtest. EXPORT.json records the target, title, project hash, plugins, resources, resource filtering and save location.

Caution. Game folders must be local, empty, and outside the Isberg Labs folder; network paths, URLs and paths through symbolic links are refused. A playable HTML export is limited to 768 MB. Game packaging works only in the portable desktop app.

Compatibility report

The bottom of Deployment lists project diagnostics, or "Project validation passed." Typical entries: missing class, skill, enemy, troop or common event records; transfers to missing maps; missing tileset images or effects; enabled plugins without source; a tileset with no images assigned (the procedural preview palette is used in the editor, but your game needs real tileset images); and script or plugin commands, which run only in the browser player.

Compatibility limits

Limits. RPG Creator implements the documented project structures and tested workflows; it does not guarantee every imported project, plugin or rendering extension. Editable or preserved records may go beyond what the player currently simulates, and missing resources and unsupported commands remain visible in diagnostics. Lifecycle, battle dispatch, copied battler data, interpreter child/wait behavior, Tilemap, PIXI ticker, image frames, window overlap, input, media retry, parallax and battle presentation have implementations and focused regression coverage, and the nine bundled upstream plugins are a finite compatibility sample. Arbitrary third-party scripts can still depend on untested APIs, exact rendering constants, private internals or timing combinations. Plugins that need native process or file-system access, private renderer internals or unrestricted network access cannot run in the isolated player. Effect perspective alignment and every possible custom shader are not reference-certified. The macOS archive structure, checksums and both architectures are checked on Windows; launching on a Mac has not been verified. Editor gestures and game presentation are RPG Creator's own implementation, and third-party stock generator artwork is not supplied. Time-progress battle arithmetic (see Battles) is a compatibility assumption for imported projects.

MCP tools

  • rpg_project: create (starter or blank, name, size 1–256), inspect or update an .isbrpg with up to 1000 validated commands (project.rename, map.add/update/delete/paint, event.set/delete, database.set/delete, system.set, character.set, plugin.set/delete); in-place edits keep a snapshot of the previous file.
  • rpg_import_project: import a project folder, .rmmzproject marker or data folder into .isbrpg.
  • rpg_export_project: export data, resources and plugins to a folder or ZIP, with data-only, encryption and unused-resource options.
  • rpg_export_html: write a self-contained playable HTML game.
  • rpg_export_game: build a Windows game, macOS ZIP (arm64 or x64) or web folder into an empty directory.
  • rpg_character: compose a face, walk, damage or battler SVG sheet from a recipe.
  • rpg_diagnostics: report project validation and runtime/interchange limits.
  • rpg_playtest: start, list, inspect, move, interact, update, advance, choose, input numbers, select items, shop, start and fight battles, set switches and variables, save, load, reset and stop sessions.

Troubleshooting

"Choose one RPG project or data folder containing System.json."
The selected folder has no System.json, or more than one. Choose the project folder itself or its data folder.
"RPG project resources exceed 256 MiB." / "Each resource must be at most 64 MiB."
Remove or compress large resources (movies and audio are the usual cause).
"Encrypted resources require System.json encryptionKey."
The project contains encrypted resources but its key is missing. Import a copy that includes the key, or the unencrypted resources.
The map shows flat colored tiles instead of artwork
No tileset images are assigned. Import PNGs into img/tilesets and assign them under Assign map tileset sheets.
A plugin does nothing in playtest
Check that it is Enabled, that its source is present, and that the warnings about base plugins and load order are resolved; then press Restart. Read the player's status line for diagnostics. MCP playtests never run plugins.
"Playtest did not respond. Restart the preview."
Press Restart in the Playtest tab.
"No saved game in this browser."
The quick Load button found no quick save for this game in this browser. Saves from other browsers or games are separate.
"RPG export destination must be empty."
Choose a new or empty folder for each Windows, macOS or web export.
"Game packaging requires the portable desktop app."
Run Isberg Labs from the portable folder; packaging is not available in other hosts.
"Resize would place an event outside the map. Move the event first."
Move events (or the player start) inside the new size before resizing.

Game runtime (native engine)

The Game runtime editor runs, edits and exports complete game projects with the bundled native engine, a heavily modified Godot build. You can open an existing Godot-format project or create a demo, edit it in the persistent native editor, run it inside the workspace, debug it, add C, C++ or C# code, and export it for Windows, macOS, Linux, Android or iOS. All engine work happens on your computer.

Engine profiles and versions

The bar at the top of Game runtime has a Local engine profile selector with two choices. The editor switches to Windows native automatically when its bundled host is available; otherwise only Web compatibility can be selected. Each profile keeps its own settings in the project.

ProfileEngineWhat it provides
Windows native (default)Custom 4.7.2 editor and runtime, loaded as a DLL inside the Isberg Labs native hostThe full editor embedded in the workspace, GDScript, C# with an integrated .NET 10.0.12 runtime, C/C++ GDExtensions, Lua 5.4, Forward+, Mobile and OpenGL renderers, Vulkan compute, volumetric fog, the native debugger, and export to all platforms
Web compatibilityOfficial Godot 4.5.2 WebAssembly editor and engineThe real GDScript compiler, scene and resource loader, physics, animation and compatibility renderer in an isolated browser context, with Web and portable Windows export. No C#, GDExtension, Lua, Vulkan or compute.

Platform exports from the Windows native profile use separate, official Godot 4.5.2 export templates and a matching 4.5.2 export editor, both bundled. See Exporting games.

Bundled components

ComponentVersionUsed for
Native engine (release, debug and editor libraries)4.7.2-stable (native revision 59, managed revision 148)Edit project, Run project, debugging
.NET runtime with Roslyn compiler and engine source generators.NET 10.0.12Compile C#, C# games, the integrated .NET Windows export
Portable C/C++ compilerZig toolchain 0.15.2, with the engine's stable C ABI headerBuilding GDExtension libraries for every target
Lua GDExtension0.7.0, with Lua 5.4.7Lua scripts in native play and exported games
Software Vulkan driverSwiftShader (CPU)Vulkan rendering without a compatible GPU driver
Export editor and templatesGodot 4.5.2-stableWindows, macOS, Linux, Android and iOS exports
Web engine and editorGodot 4.5.2-stable WebAssemblyWeb compatibility profile and its exports
Note. Normal use, C/C++ and C# compilation, and export make no downloads. No separately installed engine, SDK or code editor is used.

The Game runtime panel

In the Windows native profile the panel has a main toolbar, an export bar, a status line, the engine viewport and a Tools side panel. The engine draws into its own window placed exactly over the viewport area; it hides when the panel is hidden or covered by another docked window.

Main toolbar

ControlWhat it does
Project path fieldLocal project folder, ZIP or PCK to open. Browse picks a file or folder.
Rendering methodForward+ (default), Mobile Vulkan or OpenGL compatibility. Forward+ and Mobile use Vulkan; OpenGL compatibility uses OpenGL 3.
Audio outputLocal audio (WASAPI, default) or Muted.
Software VulkanOn by default. Uses the bundled CPU Vulkan driver instead of your GPU driver. Ignored for OpenGL compatibility.
DebuggerOff by default. When on, Run project starts the debug engine library and connects the native debugger.
Edit projectOpens the project in the persistent native editor.
GDExtension (Best for Performance)On by default. New demo projects receive the C GDExtension starter.
New demoCreates a demo project and opens it in the editor.
Build GDExtensionCompiles the project's native/build.json extension for Windows.
Import assetsRuns the engine's resource import on the staged project without starting the game.
Compile C#Compiles all C# source in the project. See C#.
Run projectImports assets, then runs the game in the viewport.
Editor / GameSwitch the viewport between the editor and the running game. Each opens its session if none is running.
Save filesSaves every open scene and embeds the current files in the portable project.
Pause / resumePauses or resumes the running game's scene tree.
StopCloses the running game and returns to the editor if it is open.
CaptureSaves the current native viewport as native-viewport.png.
ToolsShows or hides the side panel.

Tools side panel

SectionControls
Native sceneThe node list of the active session (name · type). Click a node to show its properties below the list.
Scene authoringScene path (default res://new_scene.tscn), node class (default Node2D), node name (default Actor); New scene, Add node (adds under the selected node, or the root), Remove node.
Call methodMethod name (default get_position) and JSON argument array; Call runs it on the selected node and shows the result.
Local sourceA res:// path (default res://native/gamebench_extension.c), Read source, a text editor and Write source. Requires Edit project.
Native debuggerbreak, continue, step, next, out, get_stack_dump, Frame variables. See Native debugger.
Vulkan computeGLSL compute source, a float32 value list (default [1,2,3,4]) and Dispatch compute.
GDExtension · C / C++Add GDExtension starter, Build GDExtension library, an extension descriptor path (default res://extension.gdextension) and Load extension.
Engine logCompiler, importer and runtime messages from the engine.

The export bar (Lua included, export folder, target, Debug build, Export game, Check templates, Add export presets and Mobile / Apple settings) is described in Exporting games. Below about 620 pixels of width the side panel moves under the viewport.

Opening and importing projects

Game runtime opens existing Godot-format projects. Isberg Labs never runs your original files in place: it copies the project into a staging folder in its runtime cache, and all edits, imports and builds happen in that copy. The original folder is never overwritten.

  1. Type a path in the project path field or click Browse.
  2. Click Edit project to open the editor, or Run project to import and play it.
  3. Check the Engine log for import or script errors.
SourceHandling
Project folder or project.godotCopied with all files. Symbolic links are refused.
Folder with only project.binaryRecovered automatically: the engine writes project.godot and editable text copies of binary .scn and .res files under Recovered/. Originals are kept.
Project ZIP (including ZIP64)Must contain one project. Password-protected ZipCrypto/AES archives and ZIPs with several projects need archive_stage_project with password or projectPath.
PCK (format 1, 2 or 3) or an .exe with an embedded PCKUnpacked as data. Encrypted packs need their 32-byte key (64 hexadecimal characters), supplied through archive_stage_project key.

While opening, Isberg Labs also:

  • adds the bundled Lua extension when the project contains .lua files and has none, and registers project extensions so Lua loads before the first import;
  • compiles C# source before running a game that contains .cs files;
  • removes an Isberg editor bridge add-on left by an earlier session from the staged copy (your own add-ons are untouched).
Limits. .blend source files are refused; export them as GLB first, because no external modeling application is started. Missing, compiled or encrypted script source cannot be recreated from a binary project. A project needs a configured main scene that exists; a main-scene UID must resolve to a local scene. Scripts, scenes and add-ons saved by a newer engine version, and third-party native extensions, keep their own compatibility limits.

Demo project

New demo creates a small 3D project named Full runtime study: a script that uses an inner class, match and await, a vertex-animated shader material on a sphere, a physics floor, a camera and a light. In the Windows native profile it also receives the GDExtension starter (when GDExtension (Best for Performance) is on), the Lua extension and the five built-in export presets.

Edit project: the native editor

Edit project starts the actual engine editor inside the Game runtime viewport. It provides the engine's own 2D and 3D scene editing, inspector, resources, animation, materials and shaders, script editing and C# build. The editor uses a gray, beveled theme that matches the studio. Starting or stopping a game keeps the editing session.

  • Scene and resource saves write directly into the staged project.
  • Save files saves all open scenes and refreshes the portable copy stored in your .isberg project. Saving the studio project does the same.
  • Edits made from the Tools side panel, the studio Inspector or MCP enter the native editor's own undo history.
  • The editor's Build and Play commands run the same local C# compilation as Compile C#.

Local editor policy

The integrated editor runs in the engine's Offline network mode with update checks disabled. Isberg Labs removes or blocks these editor features:

  • the online Asset Library;
  • the editor's own Export dialog, export-template installer, Android build-template installer and SSH remote deploy (export from the Game runtime panel instead);
  • online documentation, community, forum, bug-report and donation links (local class reference still works; web links in documentation are blocked);
  • external code editor, terminal and external image/audio editor actions;
  • Blender import and the external FBX converter (the built-in glTF and FBX importers stay available);
  • engine compilation configuration, Quit to Project List and Reload Current Project.
Note. This is an editor interface policy. It is not an operating-system network sandbox: project scripts and extensions you run can still use any engine or OS API.

Running a game

Run project saves the editor (if open), imports the project's resources, then starts the game in the viewport with the selected rendering method, audio output and Software Vulkan setting. The status line shows the engine version, renderer and graphics adapter.

Engine library
The release library, or the debug library when Debugger is on.
Software Vulkan
A CPU renderer that works without a compatible GPU driver. It reports itself as the adapter and is much slower than a GPU. Clear the checkbox to use your graphics driver.
OpenGL compatibility
Uses your system OpenGL 3 driver. RenderingDevice features such as compute need a Vulkan renderer.
Save data
Each project's user:// data lives in a stable folder under Data\NativeRuntime in the portable folder.

Use Pause / resume, Stop and Capture to control the game. With MCP you can also press InputMap actions and advance an exact number of physics ticks: native_step advances 1 to 600 physics callbacks, then pauses.

Playing levels and scenes in the engine

Other editors can hand their content to Game runtime as a generated native project:

The conversion writes editable native scenes with hierarchy and transforms, mesh geometry, vertex colors, UVs, normals, embedded textures, native shader materials, attached GDScript and Lua, export overrides, pickups and collisions. Full 3D scenes go through GLB import so skins and transform animations survive. Authored animation is sampled at 60 frames per second by default (1 to 120 with fps). Node names that the engine does not accept are renamed with a warning and recorded in node-map.json; anything the engine cannot represent stays in workspace-source.json with a conversion warning.

Levels receive a native character controller with walk, sprint, crouch, jump, mouse look, optional health, stamina, torch and noclip, and first-person, third-person or top-down cameras:

ActionKeys
move_forward / move_backW or Up / S or Down
move_left / move_rightA or Left / D or Right
jump, sprint, crouchSpace, Shift, Ctrl
noclip, torchF, T
Capture / release mouseLeft click / Esc
Limits. The native controller uses the engine's character collision solver; it does not reproduce the lightweight editor playtest movement exactly. JavaScript scene scripts are not converted (they stay in workspace-source.json); run them in the Script workspace or the JavaScript editor.

Game-style recipes

Applying a game-style recipe to Game runtime stages a native project from that style's level blockout in the current engine profile. It does not start gameplay. See Game presets.

Scene tree, inspector and native properties

While a native session is active, the studio's shared scene tree lists the live native hierarchy under runtime / scene. Click a node to open it in the Inspector:

  • a read-only JSON view of the node's typed native properties;
  • a Native property field and a JSON value field;
  • Apply native property, which sets the value on the running game or, in the editor, as an undoable editor change that is saved to the project.

Changes to a running game affect only that instance; they are not written back to your source. Native values use typed JSON:

ValueJSON form
Vectors, quaternions, transforms, packed arrays{"kind":"Vector3","values":[1,2,3]}
Color{"kind":"Color","values":[1,0,0,1]}
Resource or node reference{"kind":"…","path":"res://…"}
Integers beyond JavaScript's exact rangeA decimal string (int64)
Objects and RIDs returned by callsSession-local handles; release them when finished

See Workspace for the shared panels.

GDExtension (Best for Performance)

A GDExtension is native machine code loaded by the engine. Use it for measured CPU-heavy work and keep other logic in GDScript, C# or Lua. New demo projects and projects generated from levels include the default C starter when GDExtension (Best for Performance) is on; for an existing project, click Add GDExtension starter.

Starter files

FileContents
native/gamebench_extension.cEditable C source. Registers GamebenchPerformance.sum_squares(count), which clamps count to 0–1,000,000 and returns the sum of squares.
native/include/gdextension_interface.hThe engine's stable C ABI header (MIT notice retained).
native/build.jsonBuild settings.
native/example.gdPrints GamebenchPerformance.sum_squares(10) (385).
native/README.txtUsage notes.
extension.gdextension, bin/…Descriptor and compiled library, written only after a successful build.

The starter is never written over existing files: if any of these paths exists, it stops before writing anything.

Building

Build GDExtension (toolbar) and Build GDExtension library (side panel) compile native/build.json with the bundled compiler. Windows cannot replace a loaded library, so the build closes the running game and editor first and reopens the editor afterwards. The descriptor is updated only when the new library exports the configured entry symbol; otherwise the previous library and descriptor are kept. Click Run project to load the new library, or enter a descriptor path and click Load extension to load it into the running session and see its initialization status.

build.json fieldDefaultValues
languagecc, cpp
sources["native/gamebench_extension.c"]1 to 1024 project files
includes["native/include"]Project folders
entrygamebench_extension_initA C identifier
descriptorextension.gdextensionProject path
optimizationReleaseFastDebug, ReleaseFast, ReleaseSafe, ReleaseSmall
freestandingtrueNo C runtime or OS libraries
TargetOutputNotes
Windows x86_64.dllBuilt by the panel buttons
Linux x86_64, arm64.soBuilt during export or through MCP
macOS x86_64, arm64, universal.dylibExport builds a universal library
Android arm64lib….soFreestanding sources only (no NDK is bundled)
iOS arm64Static .a, iOS 12.0+Freestanding C only; linking and signing happen in Xcode

Exports rebuild the starter for each target automatically. See Lua, GDExtension and C# in exports.

Limits. C++ bindings, third-party libraries and other dependencies must be in the project. C++ or system-library code for iOS needs an Apple SDK, and Android code that needs system libraries needs the Android NDK; neither is bundled. Each platform needs its own binary: a Windows DLL does not run elsewhere.

Native debugger

  1. Turn on Debugger in the toolbar.
  2. Click Run project. The game starts with the debug library and connects to a private loopback debugger.
  3. Use the Native debugger buttons in the side panel. Results appear in the details area.
ButtonEffect
breakPause script execution.
continueResume.
step / next / outStep into, step over, step out.
get_stack_dumpShow the call stack.
Frame variablesShow the variables of the top stack frame.

Through native_debugger you can also set breakpoints, evaluate expressions, skip breakpoints, ignore error breaks, request the remote scene tree, inspect and set remote object properties, and read memory usage. native_project_open accepts initial breakpoints as {path, line} pairs. The scene tree is not refreshed while the debugger is paused.

Vulkan compute

The Vulkan compute section compiles GLSL to SPIR-V on the running engine's RenderingDevice, dispatches one work group over a float32 storage buffer bound at set 0, binding 0, and shows the values read back. The default shader doubles each value, so [1,2,3,4] returns [2,4,6,8]. The session must use Forward+ or Mobile Vulkan.

For more buffers, textures or pipelines, use native_object, which exposes the engine's complete RenderingDevice API through session handles. Volumetric fog shaders render in the engine's Forward+ FogVolume renderer; the Shader materials editor's Windows Forward+ Vulkan profile previews them (see Shaders).

Native animation and tile records

When a 3D scene or level becomes a native project, its animation is baked into native animations. Property tracks cover material color, opacity, roughness and metallic; light color, energy, range and angle; camera parameters and current camera; visibility; UV offset and scale; and custom properties. Transform clips include parent motion and the authored easing at sampled times. Constant tracks shrink to one key, and authored key times are always included. Values between samples are interpolated, so arbitrary easing is an approximation in the native file; the complete scene in your project stays the exact definition.

Tile models imported from Crocotile-style projects carry native action curves, UV frame sequences and choreography. You edit these in the side panel of 3D scene & animation; they evaluate in the 3D editor and are sampled into native animation on transfer.

PanelControls
Action curvesAction list, action name, New for selected object, Rename; Property (suggestions: position, rotation, scale, visibility, opacity, color, fov, zoom, intensity, roughness, metallic) and Component (x, y, z, w, r, g, b, a, value); Read channel; key list; Time, Value and interpolation (linear, discrete, easeIn/Out/InOut for Quad, Cubic, Quart, Quint, Sine, Expo, Circ, Back, Bounce, Elastic, plus saved custom curves); Set key, Delete selected, Copy selected, Paste at time; Shift seconds (default 0.1) and Move selected keys.
UV frame sequencesSequence list and name, New, Rename, Assign to selected; frame list; Frame duration (default 0.1 s); U and V for corners 1–4; Apply frame, Duplicate, Delete, Earlier, Later, Copy frame, Paste frame.
Choreography segments & camera markersAct list and name, New act, Rename; segment list; Type (3D action or UV sequence), Action, Actor (or All actors); start, duration, timescale, offset, weight; Loop segment; Add segment, Update selected, Remove selected; Selected segment weight curve with its own keys, Local time, Amount and interpolation; camera markers with Camera, Switch at, Add camera switch, Remove switch.
Native channel curves and targetsSaved curve, Name, Kind: Cubic Bezier (x1, y1, x2, y2; drag the handles in the graph), Polynomial (coefficients, constant first), Sample keys (time 0–1, value; Linear or Step between samples), Steps (1–100,000; jump at End or Start) or Formula (t from 0 to 1 with + − * / ^, parentheses, sin, cos, abs, sqrt, min, max, clamp, pow, pi, e); Save curve. Saved target, Channel, Target (material, camera, light, node, custom), Property; Save target. The raw profile is under Advanced profile data.

The MCP equivalents are scene3d_native_info, scene3d_native_evaluate, scene3d_native_edit and scene3d_native_channels. Tile import itself is covered in Tiles.

Saving native projects

The Game runtime state is part of your .isberg project. The project stores a checksummed copy of every staged file, including scenes, imported resources, compiled C# assemblies and native extension libraries along with their source. It does not store a session, port or source path.

  • Opening a saved project restores the files into a new cache folder and shows Portable native project restored. Choose Edit project or Run project. Nothing runs automatically.
  • A changed or damaged file fails its checksum instead of loading.
  • The project's user:// save data is kept separately from authoring files, under the portable Data folder.

See Projects for project files and recovery.

Web compatibility profile

Select Web compatibility in the profile selector to use the official 4.5.2 WebAssembly editor and engine. Each project runs on its own temporary loopback address in a sandboxed browser frame without access to the studio. Remote projects, shaders, textures and packages are never fetched.

ControlWhat it does
Project path field, BrowseLocal project folder, project.godot, ZIP or PCK.
Edit project / New demoOpen the project or a demo in the persistent web editor.
Run projectImport and run. With the editor open, it saves and synchronizes files, then plays them.
Editor / GameSwitch the view.
Save filesSave the active scene and synchronize sources and import cache into the project (including deletions). The editor also synchronizes about every 15 seconds.
Pause / resume, Stop game, CaptureControl the game; Capture saves game-viewport.png from a running game.
ToolsSide panel with Native scene, Call node method / Call, Source files (path, default main.gd; Read file, Write file; up to 8 MB) and Engine log.
Export folder, target, Export gamePortable Windows game or Web game. See Web.

Starting a run from inside the web editor (its run buttons or F5 / F6) saves and synchronizes files and plays the project in the Game view.

Limits. No C#/.NET, GDExtension, Lua scene scripts, Vulkan, Forward+ or Mobile renderer effects, compute shaders, desktop TCP debugging or external processes; projects run with the compatibility renderer. Projects containing .cs, .dll or .gdextension files are refused. Up to 8 engine sessions run at once, and imports are limited to 2 GB and 100,000 files. Web audio may wait for a click or key press.

Trust and isolation

Native projects, GDScript, C# and GDExtensions run as trusted local code with full engine and operating-system access, including networking and starting processes. Only open native projects you trust. The Web compatibility profile adds a browser security boundary; it is not a verified sandbox, and a game can use CPU and memory until you stop it.

MCP tools

ToolPurpose
native_runtime_infoBundled native engine, .NET, render profiles and active sessions.
native_project_openStage and run or edit a project with renderer, driver (including D3D12), audio, debug and breakpoint options.
native_sessionStatus and logs, save editor scenes, close.
native_sceneTree, properties, get/set/call, pause, input and editor scene operations.
native_objectCreate/load resources and classes; call/get/set singletons and handles.
native_editor_fileRead, write or delete editor project source files.
native_stepAdvance 1–600 physics ticks, then optionally pause.
native_captureSave the native viewport as PNG.
native_debuggerBreakpoints, stepping, stack, locals, evaluation.
native_computeCompile and dispatch a float32 Vulkan compute shader (1–65,535 groups).
native_project_compileCompile C# with optional assembly name and local references.
native_project_recoverRecover project.godot and text resources from project.binary.
native_extension_initializeAdd and compile the GDExtension starter.
native_extension_build_defaultBuild native/build.json for a platform and architecture.
native_extension_buildBuild arbitrary C/C++ sources with language, defines, includes, optimization and entry options.
native_extension_loadLoad a descriptor into a running session.
native_shader_previewCompile shader source in the Forward+ Vulkan renderer.
archive_stage_projectStage a folder, ZIP64, PCK or embedded pack, with password, key or project path.
runtime_infoWeb compatibility profile versions and sessions.
runtime_project_inspectProject configuration and diagnostics without running code.
runtime_project_createWrite the demo project to a folder.
runtime_project_openImport and run a project in the web profile.
runtime_workspace_projectConvert a level or 3D scene into a native project.
runtime_sessionState, pause, resume, show or close a web session.
runtime_sceneInspect the tree, read properties, change scene, set a property.
runtime_callCall a node method and await its result.
runtime_inputPress or release InputMap actions with analog strength.
runtime_stepAdvance physics ticks, then pause.
runtime_objectEngine classes, singletons and handles.
runtime_materialSet a ShaderMaterial uniform.
runtime_captureCapture the viewport as PNG.
runtime_packWrite or inspect a PCK with per-file MD5 hashes.
runtime_editor_openOpen the persistent web editor.
runtime_editor_sceneOpen, create, edit, save, scan, play and stop editor scenes.
runtime_editor_fileRead, write or delete editor source files (up to 8 MB).
runtime_editor_objectCreate and save resources; call singletons in the editor.
runtime_editor_syncSave and synchronize the editor's files to the project.

Export tools are listed in Exporting games.

Troubleshooting

Windows native cannot be selected, or "Bundled Windows native runtime is unavailable"
The native host is missing from the portable folder. Extract the release again and keep the folder together. The Web compatibility profile still works.
"Native project requires project.godot (or use recover for project.binary)"
Select the folder that contains project.godot, or a binary-only project folder so recovery runs.
"Materialize source models as GLB before native import"
The project contains .blend files. Export them as GLB, or remove them from the folder.
"ZIP contains multiple projects; choose projectPath." or "Encrypted ZIP…"
Stage the archive with archive_stage_project and open the staged folder.
"Encrypted PCK requires the caller-supplied 32-byte key"
Supply the 64-hex-digit key to archive_stage_project. A wrong key reports a checksum mismatch.
"Project has no configured main scene." / "Main scene file is missing"
Set a main scene in the project settings and make sure the file is present.
The game runs very slowly
Software Vulkan is on, so rendering runs on the CPU. Clear it to use your GPU driver.
"Cannot replace the native library. Close running game/editor sessions using it…"
Stop the game and close the editor, then build again.
"GDExtension starter would overwrite an existing file"
The project already has one of the starter paths. Rename that file or keep your existing setup.
"The library does not export gamebench_extension_init…"
Your source no longer defines the configured entry symbol. The previous library was kept; fix the source or entry.
"C# compile failed; see diagnostics"
Read the compiler diagnostics in the details area, fix the source and click Compile C# again.
"Run with debugger enabled first"
Turn on Debugger, then click Run project.
"Native startup timed out"
The engine did not report ready within two minutes. Check the Engine log, or try OpenGL compatibility or Software Vulkan.
Compute or fog fails under OpenGL
Select Forward+ or Mobile Vulkan.
"Close an existing engine session before opening another."
The web profile allows 8 sessions. Stop a game or close an editor.
"Select the bundled native profile for this native/.NET resource" / "Lua scene scripts require the native runtime profile…"
Switch to Windows native.

Script workspace & languages

Isberg Labs supports GDScript, C#, C and C++, Lua 5.4 and JavaScript. The Script workspace attaches GDScript, Lua and bounded JavaScript to scene nodes and runs them step by step with inspectable state; C# and C/C++ live in native projects in Game runtime; full JavaScript has its own JavaScript editor.

Languages at a glance

LanguageWhere you write itHow it runsIn exported games
GDScript (full engine)Script workspace (GDScript · full engine) or the native editorThe engine's own GDScript compiler and runtimeAll targets
GDScript (bounded profile)Script workspace (GDScript · bounded scene profile)Isberg Labs' interpreter for a GDScript subset, stepped locallyTransferred as GDScript to native projects
C#Native editor or project filesBundled Roslyn compiler and .NET 10.0.12Windows · integrated .NET runtime only
C and C++Native project files (native/)Compiled to a GDExtension with the bundled compilerEach target, with a per-target binary
Lua 5.4Script workspace (Lua 5.4 · native / scene worker)Bundled Lua VM in a worker; Lua GDExtension in the engineAll native targets, nothing to install
JavaScript (bounded profile)Script workspace (JavaScript · bounded scene profile)Isberg Labs' interpreter for a JavaScript subsetNot transferred to native projects
JavaScript (full)JavaScript editorV8 in a dedicated workerJavaScript player for Web and Windows

The Script workspace

The workspace has three columns: SCENE NODES on the left, the source editor with a diagnostics area in the middle, and an inspector on the right. Below about 850 pixels of width the columns stack, with the editor first.

Toolbar

ControlWhat it does
Script languageGDScript · full engine, GDScript · bounded scene profile, JavaScript · bounded scene profile, Lua 5.4 · native / scene worker. Switching an empty or example editor loads that language's example.
Open sourceLoad a .gd, .js, .mjs, .lua or .txt file. The language follows the extension (.gd selects the full-engine profile) and the source is analyzed.
Save sourceSave the editor text as scene-script.gd, scene-script.lua or scene-script.js.
AnalyzeReport syntax and capability diagnostics with line and column, and list the functions found. Lua uses the real Lua compiler without running the code.
AttachStore source, language and export overrides on the selected node. Attaching does not run the script. Shortcut: Ctrl+Enter in the editor.
Run full engineAttach, then play the level in Game runtime with the real engine (GDScript and Lua). Lua always uses the Windows native profile.
Run readyStart the local runtime and run initialization and ready callbacks. With GDScript · full engine selected it does the same as Run full engine.
Step / Step 60Advance 1 or 60 local ticks.
Step secondsTick length, 0 to 0.25 seconds (default 1/60).

Tab in the editor inserts four spaces.

Scene nodes column

  • Refresh scene pulls the current level from Level & playtest and resets the local runtime. Without a level the workspace uses a one-node study scene.
  • The node list marks nodes with a script ● and without ○. Click a node to load its script.
  • Detach selected script removes the script from the node.
  • Export overrides: a JSON object of exported-variable values for the node.
  • Reset runtime restores the authoring scene; scripts stay attached.
  • Apply runtime scene commits the simulated node changes to the authoring scene.

Inspector column

  • INPUT ACTIONS: each action has a strength from 0 to 1 (defaults move_right and move_left). New action and Add action add one; × removes it.
  • Method / signal: Name (default _ready), Arguments JSON (an array), Call method, Emit signal.
  • Execution state: time, tick, node positions, script instances and variables, timers, pending tasks, errors and the last 20 log lines.
  • Supported language capabilities: the exact capability list of each profile.

Attach, run and step

  1. Open the Script workspace and select a node. Click Refresh scene to pick up the latest level.
  2. Choose a language, then type code or click Open source. Click Analyze.
  3. Enter export overrides if needed and click Attach.
  4. For local stepping, click Run ready, then Step or Step 60. Set input strengths, call methods or emit signals from the inspector.
  5. Click Reset runtime to discard the simulation, or Apply runtime scene to keep its node changes.
  6. For the real engine, click Run full engine. Compiler and runtime messages appear in Game runtime.

The local runtime is stepped manually. Level & playtest's play mode advances the same scripting engine continuously; do not step both against the same scene at once. Lua and bounded scripts can run on different nodes in one session.

GDScript

Full engine

GDScript · full engine keeps your source exactly as written and executes it with the engine's real compiler and runtime: every engine class, typed GDScript, inner classes, lambdas, match, await and so on. Analyze does not check full-engine source; compile errors appear when you run it. A full-engine script is never run by the bounded interpreter. You can also write GDScript directly in the native editor (Edit project).

Bounded scene profile

GDScript · bounded scene profile runs a GDScript subset in Isberg Labs' own tokenizer, parser, bytecode compiler and interpreter. It needs no engine, steps deterministically and saves its complete state, including suspended functions. Unsupported syntax or identifiers are reported with line and column; nothing is silently removed.

extends Node3D

@export var speed: float = 2.0
var elapsed = 0.0

func _ready():
    print("Ready")

func _process(delta):
    elapsed += delta
    position.x += Input.get_axis("move_left", "move_right") * speed * delta
    rotation.y += delta
AreaSupported
DeclarationsVariables, constants, functions with default parameters, class_name, known base classes, @export / @onready, type hints (parsed as metadata)
Control flowif/elif/else, while, for/range, typed loop variables, break, continue, return
ValuesNumbers, strings, booleans, null, arrays, dictionaries, 2D/3D vectors, member and index assignment, arithmetic, comparison and conditional expressions
Lifecycle_ready, _physics_process, _process, _input
Nodes$Child, get_node, relative paths, parent and children, transforms, visibility, metadata, groups, duplication, spawning and freeing
InputPressed, just pressed, just released, action strength, axis and vector, explicit input events
MotionPosition, rotation, scale, degree and global conversions, translate, rotate, look_at, bounded-box move_and_slide and move_and_collide
EventsDeclared signals, method calls, callable connections, one-shot and repeating timers, standalone await of a timer timeout or signal
Resourcespreload(key).instantiate() for registered local scene data
HelpersVector length, normalize, dot, cross, distance, direction, interpolation, move toward, rotation, min/max, slide, reflect, bounce, angle, limit length; trigonometry, rounding, clamp, lerp, angle lerp, wrapping, seeded random
signal opened

func _ready():
    get_tree().create_timer(0.2).timeout.connect(_open)
    await opened
    position.y += 1.0

func _open():
    opened.emit()

A suspended await is saved with the runtime and resumes after restore without rerunning _ready. await must be a statement on its own.

BoundDefault
Interpreter operations per tick50,000
Execution time per tickabout 30 ms
Call depth32 frames
Entries per array or dictionary8,192
Pending tasks and timers512
Persistent scene and runtime state4 MB
Source size256 KB, 60,000 tokens
Limits. The bounded profile does not provide engine classes or servers, full rendering, animation, physics or navigation, nested classes, closures or lambdas, match, exceptions, arbitrary annotations, module imports or await inside expressions. play(name) only records animation intent. Collisions use axis-aligned bounds. Scripts cannot reach files, the network, processes or host objects. Use the full-engine profile for anything outside the subset.

C#

C# runs only in the Windows native profile of Game runtime. Write .cs files in the native editor (or add them to the project folder) and attach them to nodes as usual.

  • Compile C# compiles every .cs file in the project with the bundled Roslyn compiler and the engine's source generators. The assembly name comes from the project's assembly_name setting (default Game). The status line reports how many files were compiled; diagnostics appear in the details area.
  • Run project compiles C# automatically before starting a game, and the native editor's Build and Play commands use the same compiler.
  • The game runs on the integrated .NET 10.0.12 runtime. No .NET SDK, MSBuild or package restore is used.
  • Local managed reference DLLs can be supplied through native_project_compile references.
Limits. NuGet restore, MSBuild tasks and platform .NET workloads are not available. The bundled 4.5.2 export templates are not .NET templates, so C# games export only as Windows · integrated .NET runtime; other targets are refused with an explanation.

C and C++ (GDExtension)

C and C++ code compiles into a GDExtension, real machine code loaded by the engine. Use the default starter's native/gamebench_extension.c, edit it in the native editor or in the side panel's Local source section, and click Build GDExtension. Call it from GDScript:

extends Node

func _ready():
    print("Native sum: ", GamebenchPerformance.sum_squares(10)) # 385

Set "language": "cpp" in native/build.json for C++. Both use the engine's stable C ABI; C++ binding libraries must be part of your project. See GDExtension (Best for Performance) for build settings, targets and limits.

Lua 5.4

Choose Lua 5.4 · native / scene worker. The full Lua language is available: local closures, tables, metatables, coroutines, multiple returns, integer operators, and the standard math, string, table and utf8 libraries. In the Script workspace each Lua node runs in its own persistent VM inside an isolated worker. In Game runtime and exported games the same source runs in the bundled Lua GDExtension.

local speed = exports.speed or 2
local elapsed = 0

function _ready()
    print("Lua scene ready", _VERSION)
end

function _process(delta)
    elapsed = elapsed + delta
    self.position.x = self.position.x
        + Input.get_axis("move_left", "move_right") * speed * delta
    self:rotate_y(delta)
    state.elapsed = elapsed
end

Callbacks

_ready(), _physics_process(delta) and _process(delta) run automatically. In the engine, _exit_tree() also runs when the node leaves the scene. Any other named function can be called with Call method.

Scene API

NameMeaning
selfThe attached node.
get_node(nameOrId), self:get_node(path)Find another scene node by name, ID or relative path.
position, rotation, scale, sizeVectors with x/y/z or indices 1–3. Assign a whole vector with {x=1,y=2,z=3} or {1,2,3}. Values must be within ±1e9. The globals position, rotation and scale refer to self.
name, visibleNode properties.
translate, rotate_x, rotate_y, rotate_z, show, hideNode methods (call with :).
get_meta, set_meta, has_metaNode metadata; each value up to 64 KiB of JSON.
Input.get_axis, get_action_strength, is_action_pressed, is_action_just_pressed, is_action_just_releasedInput actions.
exportsThe node's export overrides.
stateA table shown in Execution state (up to 6 levels, 100 entries per table, strings cut at 4,096 characters).
print(...)Writes to the log.

math.random starts from a fixed seed, so runs repeat exactly. io, os, package, require, dofile, loadfile and debug are not available.

Importing and exporting Lua source

Use Open source to load a .lua file and Save source to write the editor text to scene-script.lua. Attached source is stored with the node in your project. When a level becomes a native project, each Lua script is written unchanged to scripts/scene_N.lua and run by a scene bridge that provides the API above.

Saved sessions and replay

Saving the workspace records the starting scene plus every step, call, pause and error-clear operation, up to 10,000 operations. Reopening replays them in a fresh VM and compares the result with the saved checkpoint, so closures and coroutines come back exactly. A script that does not reproduce the same result fails the comparison and asks you to reset instead of continuing with different state. When a session reaches 10,000 operations, apply the scene and reset the runtime.

In the engine and in exported games

Run full engine transfers attached Lua source and export overrides into a Windows native project and plays it. Default native projects carry Lua GDExtension 0.7.0 (Lua 5.4.7) under addons/lua-gdextension with Windows, Linux, macOS, Android and iOS libraries and project-relative paths, so moving the project keeps Lua working. Exported games include Lua, the scene bridge, your scripts and the license notices; players install nothing. See Lua, GDExtension and C# in exports.

Native projects can also use the extension's own LuaState and LuaScript APIs (for example LuaState.new(), open_libraries(), globals, do_string()). These are a different authoring API from the scene callbacks above.

Limits. At most 64 Lua nodes run together in the Script workspace, each with a 16 MiB memory budget and 256 KiB of source; callback hooks and a worker time limit stop code that does not return. Lua scripts use named functions, not signals: Emit signal is refused. The worker has no filesystem, network, process, package loader or native modules; those boundaries do not apply in the engine, where projects run as trusted code. LÖVE, Roblox, Pixel/Aseprite and other Lua APIs are not provided and need adapting. Existing custom Lua add-ons are not replaced; conflicting files are reported. Lua needs the Windows native profile.

JavaScript

JavaScript · bounded scene profile runs a small JavaScript subset with declared lifecycle functions, or one class with fields and methods, using the same scene API as bounded GDScript. ready, fixedUpdate and update are accepted as aliases for the lifecycle names.

let speed = 2;
function _process(delta) {
  position.x += Input.get_axis("move_left", "move_right") * speed * delta;
}

The bounded profile has no global object, DOM, module loader or prototype access, and it is not transferred to native projects. For full ECMAScript with modules, classes, closures and Promises, use the JavaScript editor; Run full engine refuses bounded JavaScript and points you there.

State, resources and diagnostics

  • Variables, constants, input edge state, random state, timers, signal connections and suspended functions persist across saves and MCP calls.
  • Runtime faults name the node, method and line, and stop only the affected script instance.
  • print, warnings and errors appear in the bounded log.
  • Local prefab scenes for preload(key).instantiate() are registered with script_resource. Scripts cannot turn a path into file access.
  • The Script workspace shares its simulation with Level & playtest. Source transforms change only when you apply the simulation.

MCP tools

ToolPurpose
script_analyzeCompile Lua or parse bounded GDScript/JavaScript from text or a file; no execution.
script_attachAttach source and overrides to a level node; profile native keeps full GDScript.
script_detachRemove, enable or disable a node script.
script_stepAdvance 1–1,200 steps (0–0.25 s each) with actions and events.
script_eventCall a method, emit a signal, pause, resume or clear errors.
script_inspectRead source metadata, diagnostics and simulation variables without running _ready.
script_resourceAdd, list or remove local prefab scene data.
script_simulationReset or apply the temporary simulation.
level_playtestAdvance the shared playtest, including attached scripts.
runtime_workspace_projectTransfer a level with its GDScript and Lua into a native project.
native_project_compileCompile C#.
native_extension_buildCompile C or C++ GDExtension sources.

Troubleshooting

"Source cannot execute." after Analyze
The diagnostics list each unsupported construct with its line. Rewrite it within the subset, or switch to GDScript · full engine.
"Execution budget exceeded; script was suspended with an error."
A tick ran too long, usually an endless loop. Fix the loop and click Reset runtime.
"Export overrides must be a JSON object."
Enter overrides as {"speed": 3}, not an array or plain value.
"Choose the JavaScript engine workspace to execute full JavaScript."
Bounded JavaScript does not run in the engine. Use the JavaScript editor.
"Lua scene execution exceeded its time limit; restart the runtime."
A Lua callback did not return in time. Fix it, then click Run ready again.
"Lua session reached 10,000 operations."
Click Apply runtime scene, then Reset runtime.
"Lua session replay differed from its saved checkpoint."
The script's result depends on something that changes between runs. Reset the simulation.
"At most 64 Lua scene scripts can run together."
Disable scripts on some nodes.
Errors appear only when running a full-engine script
Full-engine GDScript is compiled by the engine. Read the messages in Game runtime's Engine log.

JavaScript editor

The JavaScript editor runs full ECMAScript game modules in a dedicated V8 worker, with a small game API for scene, input, timers, math and audio. You can step and call into a live session, save a complete session and restore it by verified replay, and export a playable 2D or 3D game for the web or Windows.

The JavaScript editor

AreaControls
Run bar▶ Run, Pause, Step, Stop, Δt (step length, 0–60 seconds, default 0.0166667), Save source project, Load project, Add local assets.
Export barExport folder, target (Portable Windows game or Web game), Web portable launcher (on by default), Export playable game.
Source columnModule list, Add module with a new module name (for example lib.mjs), Entry (default main.mjs); tabs Source, Scene JSON, Initial state; the text editor (Tab inserts two spaces).
Runtime columnA preview canvas, Send scene to 3D, Save complete session, Call with a function name (default greet) and JSON arguments, Invoke, Call status; the log, frame and time summary, and Scene and game state.

The preview draws each scene node as a marker with its name; it is a quick view, not the exported renderer. Click the canvas to give it keyboard and pointer input. Send scene to 3D opens the current scene in 3D scene & animation.

Projects and modules

A JavaScript project is one JSON file that lists every module explicitly. Save source project writes it as javascript-project.json; Load project opens a source project or a saved session.

{
  "entry": "main.mjs",
  "modules": {
    "main.mjs": "export function update(api, dt) { api.scene.translate('hero', [dt, 0, 0]); }"
  },
  "scene": {"nodes": [{"id": "hero", "transform": {"translation": [0, 0, 0]}}]},
  "state": {},
  "timeoutMs": 1000,
  "memoryMb": 64
}
FieldMeaning
entryThe module that starts the game.
modulesFile name to source text. JSON modules are allowed.
scene, state, inputInitial scene, game state and input.
assetsEmbedded local files, added with Add local assets; read with api.asset(filename).
timeoutMsDeadline per request, 20–30,000 ms (default 1,000).
memoryMbWorker heap, 16–512 MB (default 64).

Relative static imports and dynamic import() resolve only inside modules; cyclic module graphs work. URLs, file paths, Node modules and path traversal are refused. Built-in modules are @studio/math, @studio/scene, @studio/input, @studio/timers and @studio/audio.

Language support

Code runs on the V8 engine bundled with the desktop, with its standard semantics: classes and private fields, closures, generators and async generators, Promises and async/await, try/catch/finally, regular expressions, BigInt, typed arrays, Map and Set, destructuring, top-level await, and static and dynamic ES modules. Class, private-field and closure state persists for the life of the worker.

There is no DOM, browser network API, Node host module or host function. console writes to the editor log.

The game API

Export named functions start(api), update(api, dt) and onEvent(api, event), or a default class or object with those methods. A default class constructor receives api. Any named export or default-class method can be called by name; api is passed as the first argument.

import {lerp} from '@studio/math';

export default class Game {
  #updates = 0;
  start(api) { api.state.speed ??= 1; api.log('Local V8 game started'); }
  update(api, dt) {
    this.#updates++;
    const hero = api.node('hero');
    const direction = api.input.down('ArrowLeft') ? -1 : 1;
    hero.transform.translation[0] += direction * api.state.speed * dt;
    api.state.updates = this.#updates;
  }
  greet(api, name = 'player') { return {message: 'Hello ' + name, frame: api.frame}; }
}
MemberDescription
api.stateMutable JSON game state.
api.scene.get(), node(id), find(typeOrPredicate), spawn(node), remove(id), set(id, patch), translate(id, delta)Scene records. remove also removes children. api.node(id) is a shortcut.
api.input.get(), down(key), pressed(key), released(key), axis(name), pointer()This frame's input. Keys use both the key code and key name (for example ArrowLeft).
api.time, api.frame, api.deltaSimulation seconds, frame index, frame length.
api.mathclamp, lerp, seeded random and seed, vec3, add, sub, scale, dot, length, normalize.
api.timerssetTimeout, setInterval, clear, sleep, now. Global timer functions and performance.now() use the same simulation clock.
api.emit(type, value), api.log(...)Structured output events and log messages.
api.asset(name)An embedded asset as a data URI in the editor, or its file URL in an exported game.
api.audio.play(name, {volume, loop, rate}), stop(id), stopAll()Playback events for embedded audio. Volume 0–1, rate 0.05–4. Exported players play them; browsers may wait for a click or key press.

Timers advance only when the game steps. Async lifecycle methods do not block later frames, so a coroutine can wait for a future timer.

Running, stepping and calling

  • ▶ Run starts a session (if needed) and steps it every display frame (frame time capped at 0.1 s). Pause stops stepping; Step advances one Δt.
  • Stop ends the worker and releases closures and timers; the source stays.
  • Invoke calls a function with the JSON arguments. If it returns a pending Promise, the log shows a job; click Call status after stepping to see its result.
  • Up to 16 JavaScript sessions can be open at once. A request that passes its deadline ends the worker and closes the session.

Checkpoints and session replay

Save complete session writes javascript-session.json: the source plus every completed operation, its nondeterministic inputs and a hash of its result. Loading it with Load project, or reopening a project that contains it, starts a fresh worker and repeats every operation, checking each result. Private fields, closures, generator positions, Maps and Sets, timers, pending Promises and pending calls come back because their code runs again. This is verified replay, not a memory dump. Studio project saves and recovery include the journal automatically.

Determinism

  • Math.random uses a recorded seeded stream.
  • Dates, clock reads, Intl results and local date methods are recorded.
  • Timers and performance.now() follow game time; import.meta.url uses stable module names.
  • Desktop sessions pin your time zone so that local replays repeat. Exported games do not include your time zone.
Limits. A checkpoint is refused when the session used WeakRef or FinalizationRegistry, Atomics.waitAsync, WebCrypto keys, or nondeterministic work outside an operation. A changed source, damaged file, different locale or time zone, or diverging result fails the restore explicitly. Checkpoints from the editor and from an exported browser player use different profiles and are not interchangeable.

Playable game export

  1. Enter an empty local folder in the export field.
  2. Choose Portable Windows game or Web game. For Web, leave Web portable launcher on to add an offline Windows launcher in a launcher folder.
  3. Click Export playable game. The status line shows the entry file.

The export contains a real player, not just source: your modules (imports rewritten to a local map, source text otherwise unchanged), the game API, the replay recorder and the bundled 2D/3D renderer. The player renders 2D rectangles, labels, sprites and sprite frames, or 3D meshes, materials, textures, cameras and lights, including skinning, morphs, native action and UV choreography and supported shader documents. Its overlay has Pause, Save and Load.

TargetResultSaves
Portable Windows gameAn executable named after the game title, with its own sandboxed window. Runs with an empty PATH; nothing to install.Data\Saves\game.json beside the executable
Web gameindex.html and files for an HTTP(S) static host. Browsers block module workers from file://.Browser storage for that origin and profile
  • The window opens with the game title, and the game area is sized to the requested width and height (default 1280 × 720; 320–4096 × 240–2160 through v8_export_game). The editor uses the project or scene name as the title.
  • Assets are written with real extensions (.png, .jpg, .gif, .webp, .svg, .wav, .ogg, .mp3, .json) so hosts serve the right type. Assets are limited to 512 MB.
  • EXPORT.json lists the files, modules, assets and a source hash; README.txt explains how to start the game.

Windows games from the portable release reuse its desktop runtime; see Executable name and branding.

Limits. Remote asset URLs are refused. Scenes that use a native-engine shader profile must be exported through the engine. The browser player has a main-thread deadline but no per-worker heap limit.

Execution boundary

The worker receives only JSON and builds its API inside its own context. Imports are limited to your module map, and worker termination stops endless loops. These are execution controls for your own projects, not a hardened sandbox for hostile code.

MCP tools

ToolPurpose
v8_capabilitiesLanguage profile, APIs and persistence boundaries.
v8_project_saveValidate and save a source project.
v8_openStart a session from a file or modules.
v8_stepAdvance one frame (0–60 s) with input and events.
v8_callCall a named export or method.
v8_call_jobStart or poll a nonblocking async call.
v8_inspectInspect a session or list sessions.
v8_snapshotSave or restore explicit JSON scene, state, input and time.
v8_checkpointSave a complete replay checkpoint.
v8_resumeRestore a checkpoint in a new worker.
v8_resume_jobStart, poll or cancel a long restore.
v8_closeEnd a session.
v8_export_gameExport a playable Web or Windows game with title, size, launcher and asset files.

Troubleshooting

"Import is absent from local source map" / "External/host import is not exportable"
Add the imported file with Add module, or import one of the @studio/… modules.
"Close an existing JavaScript session before opening another."
Stop sessions you no longer need; 16 can be open.
"This JavaScript session uses state that cannot be reconstructed exactly"
Remove the listed feature (for example WeakRef) or keep the session live instead of checkpointing.
"JavaScript session replay diverged at event N"
The source or environment changed since the checkpoint, or the code depends on something unrecorded. Start a new session.
"JavaScript checkpoint execution environment differs."
The checkpoint was saved with a different locale, time zone or engine profile.
"Export destination must be empty."
Choose a new or empty folder outside the application folder.
The web export shows a blank page
Open it through an HTTP(S) server, or use the launcher in the launcher folder.
"Remote game assets are unavailable in a local export"
Replace URLs in the scene with embedded assets.

Exporting games

Isberg Labs exports playable games for Windows, macOS, Linux, Android, iOS/iPadOS and the web. Engine exports use the bundled Godot 4.5.2 export editor and templates, the bundled Android toolchain and the bundled compilers, so nothing is downloaded. Every export is checked after it is built.

Export routes

What you madeWhere you exportTargets
Native project (Windows native profile)Game runtime export barWindows, macOS, Linux, Android (APK, AAB + APK/APKS), iOS/iPadOS Xcode project, Windows · integrated .NET runtime
Project in the Web compatibility profileGame runtime (Web compatibility) export barWeb game, Portable Windows game
JavaScript projectJavaScript editorWeb game (optional Windows launcher), Portable Windows game
RPG Creator projectRPG CreatorWindows, macOS, web folder, single HTML file
Level or 3D sceneTransfer to Game runtime first (Playing levels and scenes)As for native projects

Targets and supported systems

TargetOutputPlayers needTo finish or distribute
Windowsx86_64 executable, .pck game data and librariesWindows 10/11 x64Nothing for GDScript, GDExtension and Lua projects
Windows · integrated .NET runtimePortable folder with Game.exe, the integrated engine and .NET runtimeWindows x64Use for C# projects
macOSUniversal (Intel and Apple Silicon) app in a ZIP, ad-hoc signedmacOS 15.0 or newerDeveloper ID signing and notarization for trusted distribution
Linuxx86_64 executable, .pck and librariesLinux x86_64 with glibc 2.34 or newerBuilt on Windows
AndroidARM64 APK, or AAB with a universal APK and APK set (.apks)Android 7.0 (API 24) or newer, ARM64Your own keystore for release builds
iOS / iPadOSComplete Xcode project with Lua and C libraries statically linkediOS / iPadOS 12.0 or newer, ARM64 devicesA Mac with Xcode, your Apple team ID, signing certificate and provisioning
WebStatic files (engine WebAssembly, .pck, index.html)A browser, served over HTTP(S)A static web host

The Studio and the bundled export editor run on Windows; every target is built there.

Exporting from Game runtime

  1. Open or create the project in the Windows native profile of Game runtime.
  2. Choose a target in the export bar: Windows, macOS (Apple), Linux, Android, iOS / iPadOS · Xcode project or Windows · integrated .NET runtime.
  3. For Android, iOS or macOS, open Mobile / Apple settings and fill in the fields you need.
  4. Read the status lines under the bar (click Check templates to refresh).
  5. Set Debug build if you want a debug export. It turns on automatically when you choose Android.
  6. Enter an empty export folder outside the project and click Export game.

Export first saves the editor, then copies the project to a temporary staging folder. Your source project is not modified. Engine caches, export_presets.cfg and export_credentials.cfg are left out of the staged copy, which is reimported with the 4.5.2 export editor. The staging step also sets the game name, enables the texture compression each platform needs, adds the target's Lua library, rebuilds the GDExtension starter for the target, and writes fresh presets.

Mobile / Apple settings

FieldDefaultNotes
Application IDcom.gamebench.gameReverse-domain form; used as the macOS and iOS bundle ID and Android package name. Change it before publishing.
Apple teamemptyRequired for iOS.
Android formatAPKOr App Bundle + APK / APKS.
Version code1Integer 1–2,100,000,000.
Version name1.0One line, up to 100 characters.
Android target API3624–99. Applies to APK and App Bundle exports.
Android SDK override (optional), JDK override (optional)empty (bundled tools)Use a local SDK or JDK 17 instead of the bundled ones.
Android release keystore, Key alias, Keystore passwordemptyFor release builds. The password is never saved.
Create release keySee Release signing.
Note. From the panel, the game is named Game: the export sets the application name to Game and names the files Game.exe, Game.apk and so on. To choose a different name, export with native_export and title.

Readiness checks

The status area shows, for the selected target: its name, ready to export or setup required, template bundled or template missing, and the export engine version. For Android it also shows whether the SDK and JDK 17 are bundled, external or missing. Requirements and warnings follow.

CheckResult when it fails
Bundled export editor and templates presentSetup required; rebuild or re-extract the portable folder
C# source in the project (any target except integrated .NET)"C# requires matching .NET export templates; use Windows native export for the bundled C# runtime."
An extension's compatibility_minimum above 4.5.2"… requires a newer Godot export engine."
Every extension has a library for the target, architecture and debug/release mode"… needs a compiled <target> <architecture> GDExtension library …"
Android release: keystore file, alias and passwordRequirement listed
iOS: Apple team ID"Set the Apple developer team ID for iOS export."
Project saved by a newer engine versionWarning; the export still validates the staged copy

Warnings always state the supported system for the bundled Lua runtime, and for macOS (ad-hoc signing), Android (debug APKs are for testing) and iOS (build and sign in Xcode). native_export_targets and mobile_export_info return the same information.

Export presets and icons

Add export presets writes the five built-in presets (Windows Desktop, macOS, Linux, Android, iOS) to the project's export_presets.cfg. An existing file is kept. New demo and generated projects receive them automatically.

PresetMain settings
AllBundled 4.5.2 debug and release templates; exports all resources plus .lua files and Lua notices; excludes native/*, .cs and .csproj; output build/<target>/Game.<ext>
Windows Desktop, Linuxx86_64, game data in a separate .pck; Windows does not change the executable's resources and does not code-sign
macOSUniversal, bundle ID from Application ID, minimum macOS 15.0, built-in ad-hoc code signing, no notarization
AndroidNo Gradle build, arm64-v8a only, package from Application ID, signed, version code and name
iOSBundle ID, App Store team ID, minimum iOS 12.0, export project only

The presets contain absolute paths to the bundled templates. Click Add export presets again in a new project after moving the Isberg Labs folder (delete the old file first, because existing presets are kept). Exports from the panel always regenerate presets in the staged copy, so they do not depend on this file.

Icons

Exports use the project's own icon (config/icon). If the project has none, a default icon is added as addons/gamebench_export/default_icon.svg and set as the icon; an existing icon or file is never overwritten. For App Bundles, an unused themed-icon entry in the template is pointed at the delivered adaptive icon.

Windows

Windows (templates)

Produces Game.exe, Game.pck, the Lua library libluagdextension.windows.template_release.x86_64.dll (or the debug variant), your GDExtension DLLs, the Godot and Lua license notices and EXPORT.json. Keep the files together.

Windows · integrated .NET runtime

Imports resources, compiles C# if present, and copies the integrated 4.7.2 engine, the self-contained .NET runtime and your project into the empty folder. Run Game.exe; no engine, .NET SDK or internet connection is needed. The game uses the renderer, audio output and Software Vulkan setting selected in the panel. Its user:// saves live in the folder's Data directory.

Portable Windows game (Web compatibility)

From the Web compatibility profile, Portable Windows game copies the desktop player and the 4.5.2 engine into a folder. The game runs in its own sandboxed local window; saves and the player's local port live in Data beside the executable. Keep all files together.

macOS

Produces Game.zip containing a universal app for Intel and Apple Silicon with the Lua library in Contents/Frameworks. The app is ad-hoc signed and requires macOS 15.0, the minimum of the bundled Lua library. For trusted distribution, sign it with your Developer ID and notarize it on a Mac.

Linux

Produces Game.x86_64, Game.pck and libluagdextension.linux.template_release.x86_64.so. The Lua library needs glibc 2.34 or newer and depends only on libc.so.6, libm.so.6 and ld-linux-x86-64.so.2; no system Lua or C++ runtime is needed. The export is built on Windows; if your copy method drops file permissions, mark Game.x86_64 as executable on Linux.

Android

Android exports use the bundled toolchain, resolved relative to the portable folder. Nothing is installed globally, no PATH change is needed, and no Android Studio, Gradle or NDK is involved.

Bundled toolVersion
Eclipse Temurin JDK17.0.20.1+1
Android SDK Build-Tools35.0.1
Android SDK Platform-Tools37.0.1
Google bundletool1.18.3

Override fields in Mobile / Apple settings take priority; system JAVA_HOME and ANDROID_HOME are used only if the bundled tools are missing.

Formats

APK
Game.apk for ARM64. The manifest's target API is set to Android target API; the APK is realigned for 16 KiB pages, re-signed and verified.
App Bundle + APK / APKS
Game.aab plus a signed universal Game.apk and an APK set Game.apks. The bundle is built and validated with bundletool, signed and strictly verified with the JDK, and round-tripped to the universal APK. App Bundles default to target API 36.

Debug signing

With Debug build on (the default for Android), the first export creates a private debug keystore and later exports reuse it, so test builds update an installed copy. Exports from Game runtime keep it at Data\NativeRuntime\Exports\Android\debug.keystore; keep your Data folder to keep that identity. The application never ships a shared private key.

Release signing

  1. Clear Debug build.
  2. Enter your keystore file, Key alias and Keystore password.
  3. Or create a new key: enter a path for a new keystore file, an alias (1–128 letters, digits, _, . or -) and a password of at least six characters, then click Create release key. It creates an RSA 3072 PKCS12 keystore valid for 10,000 days and shows the certificate SHA-256 fingerprint. An existing file is never overwritten.
  4. Click Export game.
Caution. Back up your release keystore and password. You need the same key to publish updates. The password is passed only to the export process, removed from returned logs, and not stored in the project or export report.
Limits. One base module from the precompiled template: custom Java or Android plugins, Gradle projects, Play Asset Delivery and dynamic feature modules are not built. Store submission, Play policy checks and device testing are up to you; export checks do not run the game on a device. Installing over USB depends on your device's developer settings and driver.

iOS and iPadOS

The iOS target generates a complete Xcode project on Windows: Game.xcodeproj and its companion files, the game data, and the Lua and C GDExtension libraries as ARM64 static archives linked by the project.

  1. Enter your Apple team ID in Mobile / Apple settings.
  2. Export to an empty folder.
  3. Copy the whole folder to a Mac and open the .xcodeproj in Xcode.
  4. Build, sign and provision the app with your own Apple credentials.
Limits. The export is a project, not a signed IPA, and is not compiled on Windows. It targets ARM64 devices with iOS 12.0 or newer, not the iOS Simulator. Only freestanding C extensions build without an Apple SDK; C++ or system-library code needs Xcode's toolchain.

Web

Web games come from the Web compatibility profile of Game runtime (Web game), the JavaScript editor and RPG Creator. The Game runtime web export contains index.html, the 4.5.2 engine JavaScript and WebAssembly, game.pck, audio sidecars, license notices, EXPORT.json and README.txt.

  • Serve the folder from an HTTP(S) static host. Browsers do not load WebAssembly or module workers from file://.
  • Serve .wasm as application/wasm. The README recommends Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp.
  • Browsers may wait for a click or key press before playing audio.
Limits. Web games from Game runtime cannot use C#, GDExtension or Lua scene scripts. The export destination must be empty and outside the source project.

Lua, GDExtension and C# in exports

Lua
Included by default. The export adds the target's Lua 5.4 library, your .lua files unchanged, the scene bridge and the Lua license notices. Players need no Lua interpreter, add-on or download. iOS links Lua statically; Android carries the matching C++ runtime in the APK.
GDExtension starter
Rebuilt for each target and architecture (macOS as one universal library, iOS as a static library) before packaging.
Other GDExtensions
Must already contain a binary for every target, architecture and debug/release mode you export.
C#
Exports only as Windows · integrated .NET runtime.

Moving the source project keeps Lua and extension paths valid because they are project-relative. Staging refuses to replace conflicting add-on files.

What is verified

An export succeeds only after the delivered files pass these checks. Engine messages starting with ERROR: or SCRIPT ERROR: fail the export even if the engine exits normally. Results, the artifact's SHA-256 and any warnings are written to EXPORT.json; Lua results are under lua with deviceExecuted: false, because files are inspected, not run on the target system.

TargetChecks
All engine targetsThe output exists and is not empty; the game data contains the Lua descriptor, license and third-party notices and the extension registration; every exported .lua script is present with the same size and checksum as its source.
Windows, LinuxThe Lua library is present and identical to the verified project library. Linux: x86_64 ELF, Lua entry point exported, only libc, libm and the loader as dependencies.
macOSThe app contains game data and the universal Lua library with x86_64 and arm64 entry points; dependencies are system libraries only; Info.plist minimum version is at least 15.0.
AndroidAPK signature verified with Android's signature verifier; ARM64 shared libraries with the Lua entry point; 16 KiB ELF load-segment and ZIP alignment; C++ runtime symbols resolved; Lua assets, registration and byte-identical scripts. App Bundles additionally: bundletool validation, signing identity, target API, and size and CRC of every DEX, native and game entry.
iOSOne Xcode project and one game PCK; ARM64 static device archives linked by Xcode; Lua entry point registered with no unresolved Lua symbols; PCK bundled as a resource; extension registration.
Web compatibility exportsPCK written with per-file MD5 hashes; its SHA-256 recorded in EXPORT.json.
JavaScript exportsFile inventory, modules, assets and source hash recorded in EXPORT.json.

Executable name and branding

Windows games built by the Web compatibility profile, the JavaScript editor (including the web portable launcher) and RPG Creator reuse the desktop runtime of your portable Isberg Labs folder. Only the runtime files are copied, never the studio, your projects or your Data folder. The executable is renamed after the game title (characters not allowed in file names are removed, up to 100 characters), but it shows the Isberg Labs icon and version details under the game's file name.

MCP tools

ToolPurpose
native_exportExport a native project for windows-native, windows, macos, linux, android or ios, with title, signing, Android format, version and renderer options.
native_export_targetsReadiness, requirements and warnings for each target.
native_export_presetsWrite the five built-in presets (existing file kept unless overwrite).
mobile_export_infoAndroid APK/AAB tools and iOS prerequisites, without the desktop.
android_signing_key_createCreate a new RSA 3072 PKCS12 release key.
android_bundle_buildConvert a compiled APK into a signed, validated AAB with universal APK and APKS.
native_extension_build_defaultBuild the GDExtension starter for a target ahead of export.
runtime_exportWeb compatibility export (web or windows) with title and game-area size (128–7680 × 128–4320).
v8_export_gameJavaScript game export.
rpg_export_gameRPG Creator game export (see RPG Creator).

Troubleshooting

"Export destination must be an empty local directory." / "… must be outside the project …"
Choose a new or empty folder that is not inside the project or the Isberg Labs folder.
"The export engine reported errors; the output is not a successful build."
The log lists the engine's first error, usually a script or import error. Fix it in the project and export again.
"Export process timed out."
The export engine ran longer than four minutes. Check the log for a stalled import, and reduce or split large assets.
"C# requires matching .NET export templates …"
Choose Windows · integrated .NET runtime, or remove the C# files.
"… needs a compiled … GDExtension library …"
Add a binary for that target to the extension, or remove the extension.
"Application ID must use reverse-domain form …"
Enter an ID such as com.example.game.
"Android release export requires androidKeystore, androidKeystoreUser and androidKeystorePassword."
Fill in the keystore fields, or turn on Debug build.
"Signing keystore already exists; it will not be overwritten."
Choose a new file path for Create release key, or use the existing keystore.
"Another Android export holds the debug signing lock"
Wait for the other export to finish.
"Lua export verification failed: …"
A Lua file, library, registration or notice is missing or differs from the source. Check for conflicting files under addons/lua-gdextension and export again.
"Bundled portable desktop runtime is unavailable."
The portable folder is incomplete. Extract the release again.
"Project assets require a local engine import before exporting."
Run the project once (or use Import assets) before exporting from the Web compatibility profile.

MCP server guide

Isberg Labs includes a local Model Context Protocol (MCP) server with 375 tools. Any MCP client can use it to create and edit sprites, sounds, 3D scenes, levels, RPG projects and native games on your computer, and to operate the desktop editors through their real controls. This chapter explains how to connect a client, how the two kinds of tools behave, and which rules the server enforces.

What the server is

  • The server is resources\app\mcp\server.js in the portable folder. It runs inside the bundled Isberg Labs.exe in script mode, so you do not install Node.js or anything else.
  • It uses the stdio transport: your MCP client starts the server as a child process and exchanges protocol messages over standard input and output. Standard output is reserved for protocol messages; diagnostics go to standard error.
  • The server reports the name gamebench and the application version (0.21.0). The name is kept from earlier releases so that existing client configurations keep working.
  • This build registers 375 tools. The live tools/list response is authoritative for names, parameters and limits; resources\app\docs\MCP-CAPABILITIES.json records the same registry, and MCP tool reference documents every tool.
  • When a client connects, the server sends short usage instructions (the platform guide) that tell the client which tool families to use.
  • Tool results are JSON text. Most image tools also return a PNG preview so the client can see what changed. Failures come back as tool errors whose text starts with Error:.
  • Tool work stays on your computer. The only network traffic is license activation and validation; every other remote request is blocked. The desktop control channel listens only on 127.0.0.1 and requires a random token written to the portable Data folder.
  • There is no tool that evaluates arbitrary JavaScript in the editors, and no generative AI, model or inference component.

Readable resources

Besides tools, the server offers these text resources:

URIContent
gamebench://guidePixel-art workflow and anatomy rules (the same text as pixel_guide).
gamebench://platformTool inventory and local transport policy (JSON).
gamebench://interchangeSupported interchange formats and their compatibility boundaries.
gamebench://scene3d3D scene geometry, skeletal animation and interchange workflows.
gamebench://javascriptThe V8 JavaScript language profile and runtime APIs.
gamebench://knowledge/<topic>Pixel-art knowledge base; topics animation, cleanup, craft, critique, pxl, tiles.

License requirement

Every MCP tool needs this device's activated Isberg Labs license. It is the same activation the desktop uses, stored in the portable Data folder, so activating in either place covers both. A running free trial counts as a license.

Without a usable license, every tool call returns an error that starts with Isberg Labs license required:, followed by the reason (for example, the device is not activated, or the license has not been validated online for more than 14 days) and the hint to activate the device in the studio or run MCP.cmd --license activate <key>.

  • The server checks the saved license when the first tool runs. While licensed, it rechecks at most once an hour. While unlicensed, it rechecks every 30 seconds, so activating in the desktop takes effect without restarting your client.
  • Online validation happens about once a day. The desktop and any number of MCP server processes on the same installation share one validation.
  • On a computer without the desktop open, activate from a terminal with MCP.cmd --license; see License commands.
  • No environment variable or option skips the license check.

For trials, device limits, offline grace and deactivation, see License.

Connecting a client

These steps assume the portable folder is C:\Isberg Labs. Use your own folder path.

  1. Activate Isberg Labs on this device (in the desktop license window, or with MCP.cmd --license activate <key>).
  2. Open your MCP client's server configuration and add an entry like this one. JSON strings need doubled backslashes.
    {
      "mcpServers": {
        "gamebench": {
          "command": "C:\\Isberg Labs\\Isberg Labs.exe",
          "args": [
            "C:\\Isberg Labs\\resources\\app\\mcp\\server.js"
          ],
          "env": {
            "ELECTRON_RUN_AS_NODE": "1",
            "GAMEBENCH_WORKSPACE": "C:\\Isberg Labs\\Projects"
          }
        }
      }
    }
  3. Restart or reload the client so it starts the server.
  4. Check the connection: the client should list 375 tools. Call studio_capabilities; it returns the tool names, the tool count and the local-only policy.

The portable folder contains mcp-config.json with the same structure. It ships with placeholder paths (C:\Isberg Labs\…); the first time you start Isberg Labs.exe it writes your folder's real paths into the file, and it does so again after you move the folder. A configuration you edited is left alone as long as its command points at an existing file. Copy the entry into your client after starting the studio once. You can name the entry anything; gamebench is simply the name earlier releases used.

In the desktop, MCP connection at the bottom of the Tools rail shows a short reminder of these settings.

Using MCP.cmd instead

MCP.cmd in the portable folder starts the same server. It sets ELECTRON_RUN_AS_NODE itself and passes its arguments through:

{
  "mcpServers": {
    "gamebench": {
      "command": "C:\\Isberg Labs\\MCP.cmd",
      "env": { "GAMEBENCH_WORKSPACE": "C:\\Isberg Labs\\Projects" }
    }
  }
}

MCP.cmd does not set GAMEBENCH_WORKSPACE. Without the env entry above, relative paths resolve against whatever folder the client starts the server in. If your client cannot start a .cmd file, use the Isberg Labs.exe form.

Why ELECTRON_RUN_AS_NODE is needed

ELECTRON_RUN_AS_NODE=1 makes Isberg Labs.exe run the script you pass instead of opening the desktop window. Without it, the executable starts the desktop application and your client gets no MCP connection. The server removes the variable again when it starts the desktop for workspace tools.

After moving the folder

  1. Keep the portable folder together. The server needs resources\app, the bundled libraries next to Isberg Labs.exe, and the Data folder.
  2. Update command, the path in args and GAMEBENCH_WORKSPACE in your client configuration to the new location.
  3. If you moved to another computer, that computer needs its own activation. Deactivate the old device first if your license is already in use; see License.

Environment variables

Set these in the env block of your client configuration. The GAMEBENCH_ names are kept from earlier releases.

Read by the MCP server

VariableEffectDefault
ELECTRON_RUN_AS_NODEMust be 1 so that Isberg Labs.exe runs the server script.Not set (set by MCP.cmd)
GAMEBENCH_WORKSPACEBase folder for every relative path in tool arguments. Absolute local paths always work.The folder the server was started in. The shipped mcp-config.json sets the portable Projects folder.
GAMEBENCH_PROFILEProfile folder for settings, automatic recovery and the desktop connection file bridge.json. The MCP server and the desktop must use the same profile to reach each other; the desktop that workspace tools start inherits this value.The portable Data folder
GAMEBENCH_STYLESFolder for style cards used by style_save and style_list. By default the server uses the same folder as the desktop, so both share one library. Cards saved by earlier versions in %APPDATA%\gamebench\styles are copied over once.The styles folder in the portable Data folder (or in GAMEBENCH_PROFILE)
ISBERG_LICENSE_DIRFolder that holds license.json, license.lock and license-retry.json. The desktop and the server must use the same folder, otherwise the server reports the device as not activated.The portable Data folder
ISBERG_LICENSE_CONFIGIgnored by the portable release. The packaged build always uses its shipped license settings.—

Read by the desktop that workspace tools start

A desktop started by a workspace tool inherits the server's environment, so these also take effect when set in your client configuration.

VariableEffectDefault
GAMEBENCH_PROFILEAs above: profile folder for settings, recovery and bridge.json.The portable Data folder
GAMEBENCH_PORTPort of the desktop's local server on 127.0.0.1. Workspace tools read the port from bridge.json; pixel_open_in_app and the automatic reload notices for edited files use this variable too, so set the same value for the studio and the MCP server.47829
GAMEBENCH_CACHEFolder for temporary media conversion jobs.The system temporary folder (subfolder gamebench-media)
Note. Some video error messages mention GAMEBENCH_FFMPEG. This build does not read that variable: video_to_pixel always uses the codec bundled in resources\app\vendor.

Engine tools and workspace tools

The tools fall into three groups, depending on whether they need the desktop application.

GroupDesktopExamples
Engine toolsNot needed. They read and write local files directly with the same engines the editors use.pixel_*, anim_*, io_*, fx_*, palette_*, sfx_*, audio_*, music_*, parameter_sound_*, model_*, mesh_*, avatar_*, most scene3d_*, level_*, rpg_*, script_*, v8_*, archive_*, most interchange_*, media_encode_audio
Workspace toolsStarted automatically. If the desktop is not running, the server starts the same bundled application with its window hidden and waits for it (about 12 seconds at most).workspace_*, world_*, workspace_game_preset_apply, asset_documents and most asset_document_*, most runtime_* and native_*, runtime_editor_*, shader_compile, shader_preview, shader_graph_preview, shader_scene_material
Running-desktop toolsRequired, but not started for you. They use a desktop you opened yourself or one a workspace tool already started.studio_* (except studio_capabilities), scene3d_open, scene3d_render, scene3d_render_status, interchange_open, interchange_export_live, pixel_lua_ui, pixel_plugin_ui
  • When no desktop is reachable, running-desktop tools return Isberg Labs is not running. Start the desktop app to use UI automation. Call any workspace tool (for example workspace_layout) first to start the hidden desktop, or open Isberg Labs.exe yourself.
  • If you already have the desktop open with the same Data folder, workspace tools operate that window, so you can watch the changes.
  • workspace_window with {"show": true} shows the hidden session; {"show": false} hides it again. No second application is launched.
  • The hidden desktop keeps running after your client disconnects. Show it with workspace_window and close it normally; closing writes the automatic recovery project.
  • The hidden desktop needs the activated license as well. If it cannot start, workspace tools report The bundled workspace did not start.
  • Engine image tools notify a running desktop after each write so the open document reloads. pixel_open_in_app opens a file in the running Pixel editor and reports when no desktop is running.

Workspace command flow

Workspace tools operate the integrated editors through the same controls you click. Discover the controls first, then run them by ID.

Editor IDs

IDEditor
homeOverview (not a creative editor)
pixelPixel & animation
textureTextures & terrain
mapsWorld builder
scene3d3D scene & animation
audio-advancedMusic & composition
levelLevel & playtest
rpgRPG Creator
modelTile modeler
meshVertex painter
materialsSprite lighting
audioAudio workshop
parameter-sfxParameter sound
sfxSound designer
avatarAvatar stage
javascriptJavaScript
runtimeGame runtime
interchangeFormats & interchange
scriptsScript workspace
shader-graphShader graph
shaderShader materials

studio_status lists the same IDs with each editor's title and whether it is loaded.

Discover, run, save

  1. Discover. Call workspace_commands with {"workspace": "sfx"}. It returns every button, input, select and text area with id, label, type (action, select, text, number, range, checkbox, file and so on), current value, visible, disabled, and where present min, max, step, accept and options. Controls without their own element ID get generated IDs such as control-12 in discovery order; discover again after the editor reloads. For nested editors, pass frame: a CSS selector or an ordered list of up to 8 selectors.
  2. Run. Call workspace_execute with the IDs you found:
    • values: an object of control ID to value. Each value goes through the control's normal input and change events. File controls are rejected here; use workspace_import.
    • action: the ID of a control to click after the values are set.
    • files: up to 100 local files, consumed in order by the editor's open dialogs.
    • out (exact file) or outDir (folder plus the editor's suggested file name): where save dialogs and downloads are written. An export without either fails with Supply out or outDir to export through MCP.
    • overwrite: allow replacing an existing output file. Without it, an existing file is refused.
    • waitMs: how long to wait for outputs, 100 to 20000 ms (default 1000).
    The result is {"id", "pending", "outputs": [{"path", "bytes"}], "error"}. Only one file operation runs at a time.
  3. Import. To feed files into a specific file control (image, video, soundtrack, reference, layout or project inputs), call workspace_import with workspace, control, files and optionally mimeType.
  4. Finish long exports. If pending is true, call workspace_file_job with {"id": "…"} until outputs lists your files. Pass "finish": true to release the capture. Files are written locally; nothing is uploaded.
  5. Save one editor. workspace_save writes an editor's complete state to a local JSON file (for the World builder, all initialized subeditors). workspace_open restores it (state files up to 256 MB). An editor without a state adapter answers Use this editor’s project save/open controls through the UI tools.
  6. Save the whole project. studio_project_state without arguments reads the shared project (supported editor states and the asset shelf); with value it replaces it. For a portable .isberg file, use workspace_project_save and workspace_project_open: the application writes and reads the file itself, so large embedded assets do not travel over MCP.
  7. Verify. A successful click does not prove the artwork, geometry or audio is right. Read the state again, or capture a canvas with studio_capture (optionally saving a PNG with out).

Each workspace_execute call is one step in the shared undo history. workspace_history takes action inspect (default), undo, redo or clear. workspace_recovery finds the automatic recovery project and restores it with {"restore": true}.

World builder subeditors

The World builder contains four engines named town, buildings, terrain and floorplan. world_editor activates one, world_editor_state reads or replaces its complete native state (including editable terrain height and surface arrays), and world_generate runs its generator, optionally after replacing the state. See World builder.

Windows and layout

  • workspace_layout reads or replaces the whole layout: dock tree, floating windows back to front, bounds, minimized states, focus and the maximized group.
  • workspace_dock takes action open, close, split (with direction row or column), move (with group), float, bounds (with x, y, width of at least 80 and height of at least 60), focus, minimize, restore, maximize or cascade. Besides editor IDs it accepts the utility panels $tools (Tools & scene), $project (Inspector & assets) and $bottom (Files, animation & output). Positions persist in project saves. See Workspace.

Low-level control

When named commands are not enough, studio_inspect lists an editor's buttons, inputs, selects, text areas, canvases and frames (or the elements matching a selector),studio_click, studio_fill and studio_select operate a control by CSS selector, and studio_canvas sends pointerdown, pointermove, pointerup, mouse, click, wheel, keydown or keyup events to a canvas. Canvas coordinates are CSS pixels relative to the canvas; a brush stroke needs a down, one or more moves, and an up. Take selectors from current discovery, not from assumptions. studio_publish places a local image on the shared asset shelf, and studio_switch focuses an editor.

workspace_game_presets lists the game-style recipes and what they do in each editor; workspace_game_preset_apply applies one (workspace, style, optional seed) as an undoable step. Map, level and sound recipes replace the editor's current content. See Game presets.

File paths and the workspace folder

  • Relative paths in tool arguments resolve against GAMEBENCH_WORKSPACE (with the shipped configuration, the portable Projects folder), or against the server's starting folder when the variable is not set.
  • Absolute paths work anywhere on local drives. Git Bash style paths such as /c/Users/you/art.png are accepted and converted.
  • Network and remote paths are refused: UNC paths (\\server\share), paths starting with //, and URLs such as http:// or file://. The error is Use a local filesystem path; remote resources and network shares are disabled.
  • Workspace tools resolve paths in the server before handing them to the desktop, so the editors always receive absolute local paths.
  • Edit history. Image and sprite tools save a snapshot before each write in a .gamebench-history folder next to the file (one subfolder per file, the last 50 snapshots). pixel_undo with path and optional steps restores them.
  • Reference formats stay intact. Editing an .aseprite, .ase or .pforge file without out writes a sibling .isbsprite and reports its path.
  • Layer, frame and selection targeting. Image tools that take a path also accept layer, frame and select to edit one cel of an .isbsprite or only a selected area. Edits to multi-layer sprites need layer. Tools that work on whole files add a note that these arguments were ignored.

What lives in the Data folder

The server and the desktop share the portable Data folder (or GAMEBENCH_PROFILE).

ItemPurpose
license.json, license.lock, license-retry.jsonDevice activation, the cross-process lock and the retry schedule (moved by ISBERG_LICENSE_DIR).
bridge.jsonPort, token and process ID of the running desktop. Present only while the desktop runs.
recovery\workspace.isbergAutomatic recovery project written when the desktop closes.
desktop-windows.jsonPositions of detached editor windows.
styles, palettes, scripts, lua-pluginsDesktop style cards, palettes, scripts and installed Lua extensions.
Runtime, NativeRuntime, NativeCompiler, ProjectBlobsCaches for the game runtime, native engine, compiler and project archive blobs.

Long-running jobs

The server does not use protocol-level background tasks. Long operations are exposed as tool pairs: one call starts the work and returns an ID, another reports progress, returns the result or cancels.

WorkStartPoll, finish or cancel
Editor export through named controlsworkspace_execute (result has pending: true)workspace_file_job {"id"}; "finish": true releases the capture
Full project save or openworkspace_project_begin {"action": "save" | "open", "file"}workspace_project_job {"id"}; "cancel": true cancels. A save replaces the old file only after its content hashes verify.
3D animation render to PNG frames ZIP or WebMscene3d_render {"out", "format": "frames" | "webm"}scene3d_render_status {"id"}; "finish": true
Music render or PCM processingaudio_render_job {"op": "start", "kind": "music" | "pcm", …}Same tool with op status, cancel or list. Cancelling stops the worker, even during FFT work.
Parameter sound synthesisparameter_sound_job {"op": "start", "file", "out"}Same tool with op status, cancel or list
Asynchronous JavaScript methodv8_call_job {"session", "action": "start", "name", "args"}Same tool with action: "status" and id
JavaScript checkpoint replayv8_resume_job {"action": "start", "file"}Same tool with action status or cancel
Lua script with dialogs in the Pixel editorpixel_lua_ui {"action": "begin", …}Same tool with action status or cancel and jobId
  • workspace_project_save and workspace_project_open start and wait for the same streamed job themselves.
  • Each request to the desktop has a 30-second deadline (Desktop automation exceeded its request deadline.). Use the job tools for work that takes longer.
  • Jobs and live sessions (RPG playtests, JavaScript workers, runtime and native sessions) exist only in the running server and desktop processes. Restarting your client or the server discards them, so save explicitly first.

Safety rules

  • Local files only. Network shares, UNC paths and URLs are refused (see File paths). Shader textures and scene resources from remote URIs are rejected as well.
  • Import-only formats are never written. .ase, .aseprite, .asprite, .pforge, .cpt, .laigter, .preset, .presets, .save, .croco, .crocotile and .c3dp cannot be export destinations. Each Isberg extension is reserved for its own document type; for example, a sprite document must be saved as .isbsprite.
  • No silent overwrites. Tools that have an overwrite parameter refuse an existing output (Output already exists or Destination already exists) unless you pass "overwrite": true. This includes asset_import and project_unpack. native_export_presets keeps an existing export_presets.cfg unless overwrite is true. android_signing_key_create never replaces a key.
  • Game exports need an empty destination. native_export, runtime_export, v8_export_game and rpg_export_game write to a new or empty folder.
  • Image edits are reversible. Image and sprite tools replace their target file, but keep the previous version in .gamebench-history first.
  • Safe writes. Many tools write to a temporary file and rename it into place, so an interrupted write does not leave a half-written file.
  • Project asset paths stay inside the project. Asset names must be relative paths with forward slashes; they cannot escape the project folder or pass through symbolic links. asset_search and project_pack skip symbolic links, .git, node_modules and .gamebench-history. project_unpack checks every path and hash before writing.
  • Precision is never reduced silently. Older pixel tools refuse to edit 16-bit or HDR documents; use the pixel_precision tools or an explicit 8-bit conversion.
  • Nothing is executed by accident. Archive tools inspect and extract ZIP and PCK files without running their contents. RPG imports keep plugin sources as data. Lua scripts get no file, network or process access. There is no arbitrary code evaluation tool.
  • Credentials are not stored. Android keystore passwords are passed only to the signing process, removed from returned logs, and not saved in projects or export reports.
Caution. Native project code (GDScript, C#, C and C++ extensions) that you run with the native_* and runtime_* tools is trusted local code. It is not confined by an operating-system sandbox. Run only projects you trust.

Size and count limits

ItemLimit
Desktop request / response16 MB / 32 MB, 30 seconds per request
workspace_open state file256 MB
Avatar and tile-model JSON read by tools; level projects128 MB
asset_import file192 MB
project_pack2,000 files and 192 MB of source files; the folder scan stops at 20,000 entries (pass an explicit files list instead)
audio_render WAV sourcesUp to 12 sources and 12 layers; each WAV under 96 MB and 180 seconds, mono or stereo, 16/24/32-bit PCM or float32, 8 to 96 kHz
material_render lights16
workspace_execute100 input files; waitMs 100 to 20,000
Image edit history50 snapshots per file
Level edit history20 undo and 20 redo steps
rpg_playtest sessions16 at a time

Guide tools to read first

These tools return instructions, capability reports or discovery data and change nothing. Have your client call the relevant one before it starts work in an area.

ToolWhat it returns
studio_capabilitiesAll tool names, the count, categories and the local-only policy.
pixel_guidePixel-art workflows, targeting rules and anatomy rules. Read this first for sprite work.
pixel_knowledgeKnowledge base topics craft, animation, tiles, cleanup, critique and pxl; no topic lists them.
studio_statusThe running desktop, active editor and editor IDs (needs a running desktop).
workspace_commandsEvery control, range, option and file input of one editor.
workspace_game_presetsGame-style recipes and their effect in each editor.
interchange_capabilitiesImport and export domains, diagnostics and known unsupported features.
scene3d_modeling_info, scene3d_native_info3D modeling capabilities; native tile-project actors, actions and behaviors.
scene_painter_infoScene painter targets, masks, clips and snapshots.
asset_document_adaptersWhich editable documents convert between which editors, with options and diagnostics.
surface_calibrationMaterial controls, units, defaults and evidence limits.
pixel_lua_capabilitiesThe bundled Lua 5.4 interpreter and its partial host API.
v8_capabilitiesThe JavaScript language profile, modules and runtime APIs.
runtime_info, native_runtime_infoBundled engine profiles, versions, compilers, render profiles and active sessions.
native_export_targets, mobile_export_infoExport templates, platform prerequisites and Android or iOS readiness.
rpg_diagnosticsRPG project validation, supported runtime scope and interchange limits.

Worked examples

Each line below is one tool call: the tool name followed by its arguments as JSON. Relative paths resolve against GAMEBENCH_WORKSPACE. Values in capitals, such as SESSION_ID, come from an earlier result.

Sprites and animation

Create a 16 × 16 coin, review it, add an idle animation, and export a sheet and an upscaled GIF.

pixel_guide {}
pixel_create {"path":"sprites/coin.isbsprite","width":16,"height":16}
pixel_draw {"path":"sprites/coin.isbsprite","ops":[
  {"type":"circle","cx":8,"cy":8,"r":6,"filled":true,"color":"#f2c14e"},
  {"type":"circle","cx":8,"cy":8,"r":6,"color":"#6b3d12"}]}
pixel_view {"path":"sprites/coin.isbsprite","zoom":16}
pixel_critique {"path":"sprites/coin.isbsprite","type":"item"}
anim_action {"path":"sprites/coin.isbsprite","action":"idle","tag":"idle"}
io_sheet {"path":"sprites/coin.isbsprite","out":"export/coin-sheet.png","data":"export/coin-sheet.json","dataFormat":"json-hash"}
io_export {"path":"sprites/coin.isbsprite","out":"export/coin.gif","scale":4}

pixel_critique returns SHIP or FIX with coordinates for each problem. Fix with pixel_set_ascii or pixel_draw, and undo a bad step with pixel_undo. See Pixel & animation.

Tiles and textures

Make a tileable stone tile, expand it into a 47-tile blob set, generate lighting maps, and split an existing level image into a tileset and a Tiled map.

texture_fill {"path":"tiles/stone.png","width":16,"height":16,"kind":"recipe","recipe":"stone",
  "colors":["#1f1b24","#3d3747","#615a6e","#8f879c"]}
autotile_generate {"tile":"tiles/stone.png","kind":47,"palette":"tile","out":"tiles/stone-blob.png"}
material_generate {"path":"tiles/stone.png","outDir":"tiles/maps"}
tileset_extract {"path":"maps/level1.png","tileW":16,"tileH":16,"out":"maps/level1-tiles.png","map":"maps/level1.tmj"}
tilemap_render {"tmj":"maps/level1.tmj","out":"maps/level1-check.png"}

See Textures & terrain, Sprite lighting and Tile modeler.

Sound effects and music

Generate a jump sound, encode it to Ogg Vorbis, create a short composition and render it as a background job.

sfx_presets {}
sfx_generate {"out":"audio/jump.wav","preset":"jump","seed":7}
media_encode_audio {"file":"audio/jump.wav","out":"audio/jump.ogg","format":"ogg"}
music_project {"path":"audio/theme.json","op":"create","preset":"arcade","tempo":140}
music_track {"path":"audio/theme.json","op":"list"}
audio_render_job {"op":"start","kind":"music","music":{"path":"audio/theme.json","out":"audio/theme.wav"}}
audio_render_job {"op":"status","id":"JOB_ID"}

See Audio.

3D scene

Create a scene with a cube, inspect it, import a model and export glTF binary.

scene3d_create {"out":"scenes/crate.json","name":"Crate","primitive":"cube"}
scene3d_info {"file":"scenes/crate.json"}
interchange_import {"file":"models/barrel.fbx","out":"scenes/barrel.json"}
interchange_info {"file":"scenes/barrel.json"}
scene3d_export {"file":"scenes/crate.json","out":"export/crate.glb","format":"glb"}

See 3D scene & animation and Formats & interchange.

Level and playtest

Generate a seeded platformer blockout, check it, walk forward with a jump for one second of simulation, and export a history-free level.

level_create {"out":"levels/run.json","style":"retro-platformer","seed":7,"difficulty":"standard"}
level_preflight {"path":"levels/run.json"}
level_playtest {"path":"levels/run.json","op":"reset"}
level_playtest {"path":"levels/run.json","op":"step","input":{"forward":1,"jump":true},"steps":60}
level_export {"path":"levels/run.json","out":"export/run-level.json"}

See Level & playtest.

Native game and export

Create a starter engine project, check export readiness and build a Windows game. The export tools start the hidden desktop if needed.

runtime_project_create {"directory":"games/starter"}
native_export_targets {"project":"games/starter"}
native_export {"project":"games/starter","out":"export/starter-windows","target":"windows"}

Use an empty or new out folder. See Game runtime and Game export.

RPG Creator

Create a project from the starter adventure, playtest one step, and export a playable HTML file and a Windows game.

rpg_project {"file":"rpg/quest.isbrpg","op":"create","options":{"name":"Quest","demo":true}}
rpg_diagnostics {"file":"rpg/quest.isbrpg"}
rpg_playtest {"op":"start","file":"rpg/quest.isbrpg"}
rpg_playtest {"op":"move","session":"SESSION_ID","dx":1,"dy":0}
rpg_playtest {"op":"stop","session":"SESSION_ID"}
rpg_export_html {"file":"rpg/quest.isbrpg","out":"export/quest.html"}
rpg_export_game {"file":"rpg/quest.isbrpg","out":"export/quest-windows","target":"windows"}

Playtests through MCP run without RPG plugins; plugins run in the desktop playtest and in exported games. See RPG Creator.

Desktop editors

Drive the Sound designer through its own controls, export a WAV, and save the editor and the whole project.

workspace_commands {"workspace":"sfx"}
workspace_execute {"workspace":"sfx","values":{"ID_OF_WAVEFORM":"square","ID_OF_SEED":42},
  "action":"ID_OF_EXPORT_WAV","outDir":"exports/sfx","waitMs":5000}
workspace_file_job {"id":"JOB_ID","finish":true}
workspace_save {"workspace":"sfx","out":"states/sfx.json"}
workspace_project_save {"out":"projects/session.isberg"}
workspace_window {"show":true}

Take each ID from the workspace_commands result by its label (here Waveform, Seed and Export WAV). Call workspace_file_job only when workspace_execute reported pending: true.

Tool families

The 375 tools are grouped by name prefix. Every tool is documented in the MCP tool reference; the third column links a good first tool for each family.

FamilyToolsStart withCovers
pixel_50pixel_guideSprite and image inspection, drawing, selections, grid repair, anatomy repair, critique, palettes, transforms, indexed and high-precision editing, Lua scripts and Lua extensions
anim_12anim_viewSheet animation: view, fix jitter, timing presets, walk cycles, puppets, effects, slicing, validation, GIF
spec_2spec_templateCharacter specs as JSON rendered to shaded layers
lpc_2lpc_exportLPC universal sheets
style_3style_listStyle study and style cards
pxl_8pxl_buildPXL pixel art as code, plus lighting, normals, glow and shading
fx_7fx_filterFilters, whole-sprite transforms, cleanup pipelines, recipes, palette-swap variants
palette_4palette_rampRamps, palette files, palettes from references, palette usage
project_7project_infoSprite project structure and conversion; .isbundle pack and unpack
io_5io_exportImage export, sprite sheets, sheet and sequence import, batch recipes
texture_2texture_fillProcedural pixel textures and scattering
autotile_1autotile_generate16-tile and 47-tile autotile sets
tileset_1tileset_extractTileset and Tiled map from a level image
tilemap_1tilemap_renderRender a Tiled .tmj map to PNG
slices_2slices_editSlices and 9-slice export
video_1video_to_pixelVideo or animated GIF/WebP to pixel animation
material_2material_generateSprite lighting maps and lit renders
surface_11surface_generateFull material maps, calibrated profile, presets, material projects, previews
sfx_2sfx_generateRetro sound effects
audio_4audio_catalogProcedural audio presets and scenes, PCM processing, render jobs
music_10music_projectCompositions: tracks, notes, samples, automation, effects, MIDI, tempo maps
parameter_7parameter_sound_projectParameter sound documents, controls, variations and worker synthesis
media_1media_encode_audioWAV to MP3, Ogg Vorbis or FLAC
avatar_17avatar_createLayered avatar rigs, motion, expressions, signal, PNG output
model_3model_createTile models: create, edit, export
mesh_13mesh_createVertex painter meshes: brushes, channels, normals, topology, snapshots
scene_13scene_painter_openScene painter for exported scenes
scene3d_33scene3d_create3D scenes: objects, geometry, materials, bones, skinning, animation, rigging, modeling, tile projects, render
interchange_9interchange_capabilitiesFBX, Collada, glTF, PLY, STL, OBJ, TMX and native tile import and export
level_10level_createLevels, objects, settings, preflight, playtest, export
script_8script_analyzeLua, GDScript and JavaScript scene scripts
shader_13shader_createShader materials and visual shader graphs, GPU compile and preview
runtime_20runtime_infoFull engine projects, sessions, native editor authoring, capture, Windows and Web export
native_20native_runtime_infoWindows native engine, C#, C/C++ extensions, debugger, compute, platform export
mobile_1mobile_export_infoAndroid and iOS readiness
android_2android_bundle_buildRelease keys and App Bundles
v8_13v8_capabilitiesJavaScript sessions, checkpoints and game export
rpg_8rpg_projectRPG Creator projects, import and export, characters, playtest
world_3world_editorWorld builder subeditors
archive_4archive_inspectZIP/ZIP64 and PCK inspection, extraction and project staging
asset_10asset_documentsShared editable documents, dependencies, asset search and import
workspace_18workspace_commandsDesktop editor commands, files, projects, layout, history, presets
studio_12studio_statusDesktop status, inspection, low-level control, capture, project state

Troubleshooting

The client shows no tools or reports that the server exited
Check that command and args point at your folder, that backslashes are doubled in JSON, and that ELECTRON_RUN_AS_NODE is 1. If a desktop window opens instead, the variable is missing.
Every call returns "Isberg Labs license required"
Activate this device in the desktop or with MCP.cmd --license activate <key>, or reconnect to the internet if the offline grace has run out. Run MCP.cmd --license status to see the reason. If you set ISBERG_LICENSE_DIR, the desktop and the server must use the same folder. See License.
"Isberg Labs is not running. Start the desktop app to use UI automation."
The tool needs a running desktop. Open Isberg Labs.exe, or call a workspace tool first so the server starts the hidden desktop. Both must use the same Data folder (or the same GAMEBENCH_PROFILE).
"The bundled workspace did not start."
The hidden desktop could not start within about 12 seconds. Make sure the device is activated, the portable folder is complete, and no other program uses port 47829 on 127.0.0.1.
"Use a local filesystem path; remote resources and network shares are disabled."
Copy the file to a local drive and pass that path.
"Output already exists" or "Destination already exists"
Choose a new path, or pass "overwrite": true where the tool offers it. Game exports need an empty folder.
"A file operation is already running"
Finish the earlier export with workspace_file_job and "finish": true, then retry.
Files land in an unexpected folder
Relative paths resolve against GAMEBENCH_WORKSPACE, or against the client's starting folder when it is not set. Set the variable or use absolute paths.
Style cards saved through MCP do not appear in the desktop
Both use the styles folder of the same profile. If you start the studio with GAMEBENCH_PROFILE, give the MCP server the same value (or set GAMEBENCH_STYLES, or pass dir to the style tools).
A hidden Isberg Labs process keeps running
Call workspace_window with {"show": true} and close the window normally.

More problems and fixes are in Troubleshooting.

MCP tool reference

Every one of the 375 tools in the Isberg Labs 0.21.0 MCP server, grouped by area, with its parameters. This reference is generated from the server's own registry (resources\app\docs\MCP-CAPABILITIES.json), which matches what the live tools/list returns.

Tool families

Tool names start with their family. Each family links to its tools. Open Parameters under a tool to see its inputs; required inputs are marked. To set up a client and learn the workflow first, see MCP server guide.

FamilyAreaTools
studio_*Studio control: inspect and operate the desktop UI12
workspace_*Workspace: editor commands, projects, layout, presets and recovery18
asset_*Shared project assets and editable documents10
archive_*ZIP and PCK archives4
pixel_*Pixel art: drawing, analysis, repair, Lua and plugins50
project_*Sprite projects (.isbsprite): layers, frames, color modes, packing7
palette_*Palettes4
style_*Art styles3
spec_*Sprite specs and templates2
pxl_*PXL art as code8
lpc_*LPC character parts2
slices_*Slices2
anim_*Sprite animation and sheets12
fx_*Image effects and filters7
io_*Image import/export and sprite sheets5
video_*Video to pixel art1
texture_*Texture fill and scatter2
tileset_*Tilesets1
tilemap_*Tilemaps1
autotile_*Autotiles1
surface_*Sprite lighting surfaces and material projects11
material_*Material maps2
scene_*Scene painter (.isbscene)13
world_*World builder3
level_*Level & playtest10
scene3d_*3D scene & animation33
model_*Tile models (.isbtiles)3
mesh_*Vertex painter meshes13
interchange_*Formats & interchange9
music_*Music & composition10
audio_*Audio processing and rendering4
parameter_*Parameter sound (.isbsound)7
sfx_*Sound designer2
media_*Audio encoding1
avatar_*Avatar stage (.isbavatar)17
rpg_*RPG Creator (.isbrpg)8
script_*Scene scripts8
v8_*JavaScript (V8) runtime and export13
shader_*Shader graph and shader materials13
runtime_*Game runtime: projects, editor, sessions and export20
native_*Native engine: projects, extensions, debugger and export20
mobile_*Mobile export information1
android_*Android signing and bundles2
Total375
Note. Every tool needs this device's activated Isberg Labs license or trial. All tools run locally over stdio. Calls return when the work is done; long-running exports and renders have their own …_job and status tools.
375 tools

Studio and workspace

Drive the running studio, its windows, layouts, presets and whole-project saving.

studio_* · Studio control: inspect and operate the desktop UI (12)

studio_status

Inspect the running local desktop platform, active workspace and available workspace identifiers.

No parameters.

studio_switch

Switch to a named integrated desktop workspace.

Parameters (1) · required: workspace
ParameterTypeDescription
workspace requiredstring
min length 1, max length 80

studio_inspect

Inspect visible controls and state in an integrated editor. Pass frame selector(s) to inspect nested local editor frames.

Parameters (4)
ParameterTypeDescription
workspacestring
max length 80
framestring or array of string
selectorstring
max length 1024
limitinteger
1–500

studio_click

Click a named CSS control in an integrated editor. Supports nested frame selectors; cannot execute arbitrary code.

Parameters (3) · required: selector
ParameterTypeDescription
workspacestring
max length 80
framestring or array of string
selector requiredstring
min length 1, max length 1024

studio_fill

Fill a text, number, range or checkbox control and dispatch its normal input/change events.

Parameters (4) · required: selector, value
ParameterTypeDescription
workspacestring
max length 80
framestring or array of string
selector requiredstring
min length 1, max length 1024
value requiredstring or number or boolean

studio_select

Select a native dropdown option in an integrated editor.

Parameters (4) · required: selector, value
ParameterTypeDescription
workspacestring
max length 80
framestring or array of string
selector requiredstring
min length 1, max length 1024
value requiredstring
max length 4096

studio_canvas

Send bounded pointer or key input to an editor canvas. Coordinates are canvas CSS pixels; use mouse/pointer down, move and up for brush strokes.

Parameters (13) · required: selector, event
ParameterTypeDescription
workspacestring
max length 80
framestring or array of string
selector requiredstring
min length 1, max length 1024
event required"pointerdown" | "pointermove" | "pointerup" | "mousedown" | "mousemove" | "mouseup" | "click" | "wheel" | "keydown" | "keyup"
xnumber
-100000–100000
ynumber
-100000–100000
buttoninteger
0–2
buttonsinteger
0–7
deltaYnumber
-10000–10000
keystring
max length 40
shiftKeyboolean
ctrlKeyboolean
altKeyboolean

studio_capture

Capture the running local desktop workspace for visual verification. Optionally save its PNG locally.

Parameters (4)
ParameterTypeDescription
workspacestring
max length 80
framestring or array of string
selectorstring
max length 1024
outstring
min length 1

studio_publish

Publish a local image into the shared platform asset shelf or send it to an integrated workspace.

Parameters (3) · required: file
ParameterTypeDescription
file requiredstring
min length 1
workspacestring
max length 80
namestring
max length 200

studio_workspace_state

Read or replace a workspace state through its structured local state adapter. No script evaluation is exposed.

Parameters (2)
ParameterTypeDescription
workspacestring
max length 80
valuemap of any

studio_project_state

Read or replace the complete shared local project state, including supported workspace states and the asset shelf.

Parameters (1)
ParameterTypeDescription
valuemap of any

studio_capabilities

List the platform tool categories, local-only policy and direct/interactive automation coverage.

No parameters.

workspace_* · Workspace: editor commands, projects, layout, presets and recovery (18)

workspace_game_presets

List game-style recipes and their concrete effect in all nineteen editors. Selecting a recipe does not modify content.

No parameters.

workspace_game_preset_apply

Apply a game-style recipe to one editor as a shared undoable operation. Map, level and sound recipes replace their current content; inspect workspace_game_presets for other effects.

Parameters (3) · required: workspace, style
ParameterTypeDescription
workspace required"pixel" | "texture" | "maps" | "scene3d" | "audio-advanced" | "level" | "model" | "mesh" | "materials" | "audio" | "parameter-sfx" | "sfx" | "avatar" | "javascript" | "runtime" | "interchange" | "scripts" | "shader-graph" | "shader"
style required"retro-platformer" | "fantasy-rpg" | "dungeon-crawler" | "sci-fi-shooter" | "survival-horror" | "stealth" | "cozy-sim" | "strategy" | "racing" | "puzzle"
seedinteger
0–4294967295

workspace_history

Inspect, undo, redo or clear the shared document history across integrated editors. Project saves retain the shared history; editor changes use lossless state adapters.

Parameters (1)
ParameterTypeDescription
action"inspect" | "undo" | "redo" | "clear"

workspace_project_save

Save the entire unified project, embedded assets, all editor sessions and dock layout to a local file without streaming large assets over MCP.

Parameters (1) · required: out
ParameterTypeDescription
out requiredstring
min length 1

workspace_project_open

Open a full portable unified project from disk, restoring its embedded editor resources and layout.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1

workspace_project_begin

Begin a streamed full project save/open without blocking MCP. Poll workspace_project_job for progress, completion or cancellation.

Parameters (2) · required: action, file
ParameterTypeDescription
action required"save" | "open"
file requiredstring
min length 1

workspace_project_job

Inspect or cancel an active streamed project save/open job. Saves replace the previous file only after its content hashes verify.

Parameters (2) · required: id
ParameterTypeDescription
id requiredstring
cancelboolean

workspace_project_archive

Inspect a portable project archive, or import/export a content-addressed local asset blob without sending its bytes over MCP.

Parameters (3) · required: action, file
ParameterTypeDescription
action required"inspect" | "blob_import" | "blob_export"
file requiredstring
min length 1
referenceobject

workspace_window

Show or hide the bundled editor window; hidden engine sessions can be made visible without launching another tool.

Parameters (1) · required: show
ParameterTypeDescription
show requiredboolean

workspace_layout

Read or replace the complete workspace layout: dock tree, floating windows ordered back to front, pixel bounds, minimized states, focus and maximized group. Version 1 dock-only projects remain supported.

Parameters (1)
ParameterTypeDescription
valuemap of any

workspace_dock

Arrange local editor windows and utility panels ($tools, $project, $bottom). Float, move/resize bounds, focus/raise, minimize, restore, maximize, close, cascade, or use split docking. All positions persist in project saves.

Parameters (8) · required: action
ParameterTypeDescription
action required"open" | "close" | "split" | "move" | "float" | "bounds" | "focus" | "minimize" | "restore" | "maximize" | "cascade"
workspacestring
min length 1, max length 80
direction"row" | "column"
groupstring
xnumber
-100000–100000
ynumber
-100000–100000
widthnumber
80–100000
heightnumber
60–100000

workspace_recovery

Locate the local automatic recovery project and optionally restore it. Restoring opens the copy from the previous session (recovery/workspace.previous.isberg, kept at start) when there is one, otherwise the latest automatic copy. Recovery data travels with the portable Data folder.

Parameters (1)
ParameterTypeDescription
restoreboolean

workspace_commands

Discover every setting, action, range, enum and local file control in a bundled editor. Starts the bundled platform invisibly if needed; no installed editor is used.

Parameters (2) · required: workspace
ParameterTypeDescription
workspace requiredstring
min length 1, max length 80
framestring or array of string

workspace_execute

Set named editor settings and run a named action. Use workspace_commands for stable control IDs. All original editor controls are supported, including native file dialogs and captured downloads.

Parameters (9) · required: workspace
ParameterTypeDescription
workspace requiredstring
min length 1, max length 80
framestring or array of string
actionstring
valuesmap of string or number or boolean
filesarray of string
max 100 items
outstring
min length 1
outDirstring
min length 1
overwriteboolean
waitMsinteger
100–20000

workspace_import

Import local files into a named editor file control, including image, video, soundtrack, reference, layout and project inputs.

Parameters (5) · required: workspace, control, files
ParameterTypeDescription
workspace requiredstring
min length 1, max length 80
framestring or array of string
control requiredstring
min length 1
files requiredarray of string
min 1 items, max 100 items
mimeTypestring

workspace_file_job

Inspect a pending local export. Finish releases capture after the outputs have arrived; no file is sent to a remote service.

Parameters (2) · required: id
ParameterTypeDescription
id requiredstring
finishboolean

workspace_save

Save a complete editor state to a local JSON file. World-editor state includes all initialized subeditors, not just input controls.

Parameters (2) · required: workspace, out
ParameterTypeDescription
workspace requiredstring
min length 1, max length 80
out requiredstring
min length 1

workspace_open

Restore a complete editor state from a local JSON file.

Parameters (2) · required: workspace, file
ParameterTypeDescription
workspace requiredstring
min length 1, max length 80
file requiredstring
min length 1

Assets, documents and archives

Share editable documents between editors and unpack archives.

asset_* · Shared project assets and editable documents (10)

asset_document_adapters

Discover named editable-scene, model, image, shader, script and audio adapters with their supported options and conversion diagnostics. Does not start a desktop or execute source.

Parameters (2)
ParameterTypeDescription
sourcestring
targetstring

asset_documents

List shared typed document/image assets, revisions, dependency diagnostics and linked-editor bindings. Full payloads are optional; large payloads can be exported directly to files.

Parameters (2)
ParameterTypeDescription
idstring
min length 1
includeStateboolean

asset_document_publish

Publish or update the active editable document from an integrated editor. Compatible linked editors receive updates unless they have local changes; conflicts retain their edits.

Parameters (3) · required: workspace
ParameterTypeDescription
workspace requiredstring
min length 1
idstring
min length 1
namestring

asset_document_apply

Open a shared editable document in an editor. Named scene/model/image/PCM/shader/script adapters preserve editable source context; options select targets and explicit bounces. force explicitly replaces local edits.

Parameters (5) · required: id, workspace
ParameterTypeDescription
id requiredstring
min length 1
workspace requiredstring
min length 1
mode"linked" | "copy"
forceboolean
optionsmap of object

asset_document_import

Import a local editor-state JSON file into project assets without routing the file payload through MCP. editor/workspace identifies its source document model.

Parameters (4) · required: file, workspace
ParameterTypeDescription
file requiredstring
min length 1
workspace requiredstring
min length 1
namestring
idstring
min length 1

asset_document_export

Export an editable asset payload directly to a local JSON file.

Parameters (2) · required: id, out
ParameterTypeDescription
id requiredstring
min length 1
out requiredstring
min length 1

asset_document_dependencies

Set explicit asset dependencies; detects missing references and refuses dependency cycles.

Parameters (2) · required: id, dependencies
ParameterTypeDescription
id requiredstring
min length 1
dependencies requiredarray of string
max 1024 items

asset_document_remove

Remove a shared project asset. Referenced assets require force; file contents outside the project are never deleted.

Parameters (2) · required: id
ParameterTypeDescription
id requiredstring
min length 1
forceboolean

asset_import

Copy a local file into a project asset folder, without replacing existing files unless overwrite is true.

Parameters (4) · required: source, root, name
ParameterTypeDescription
source requiredstring
min length 1
root requiredstring
min length 1
name requiredstring
min length 1
overwriteboolean

archive_* · ZIP and PCK archives (4)

archive_inspect

Inspect ZIP/ZIP64 or standalone/embedded PCK metadata without executing its contents. PCK encrypted directories require a supplied raw key.

Parameters (4) · required: file, format
ParameterTypeDescription
file requiredstring
min length 1
format required"zip" | "pck"
keystring
offsetinteger
≥ 0

archive_extract_zip

Stream local ZIP/ZIP64 stored, deflate or Zstandard files with CRC verification. Supplied ZipCrypto/AES passwords decrypt inside the platform. Unsafe paths, symlinks and invalid authentication fail.

Parameters (7) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
prefixstring
passwordstring
overwriteboolean
maxEntrySizeinteger
> 0
maxTotalSizeinteger
> 0

archive_extract_pck

Stream PCK v1/v2/v3 resources from local packs or embedded executable containers without launching them. Supports supplied-key AES-CFB, removal markers and explicitly selected sparse roots.

Parameters (7) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
keystring
offsetinteger
≥ 0
sparseRootstring
min length 1
overwriteboolean
maxTotalSizeinteger
> 0

archive_stage_project

Stage a local source folder, ZIP64, PCK or embedded executable pack into an empty project directory. Extraction does not execute scripts. Binary configuration recovery uses the separately invoked native engine operation.

Parameters (6) · required: source, out
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
profile"native" | "web"
keystring
passwordstring
projectPathstring

Pixel art and sprites

Draw, analyse, repair and script pixel art and sprite projects.

pixel_* · Pixel art: drawing, analysis, repair, Lua and plugins (50)

pixel_guide

Read the Isberg workflow and anatomy rules for fixing image pixel art (hands, feet, faces, limbs, animation). Read this first.

No parameters.

pixel_analyze

Analyze an image: size, fake-pixel grid (image/upscaled detection), palette + ramps, outline color, symmetry, and a list of detected issues.

Parameters (4) · required: path
ParameterTypeDescription
path requiredstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_view

Render the image (or a region) zoomed with a pixel grid and coordinate rulers so you can see exact pixel positions. Use a small region (e.g. 24x24) around a hand/face for detail.

Parameters (7) · required: path
ParameterTypeDescription
path requiredstring
regionobject
zoominteger
1–48
gridboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_compare

Show two images side by side (e.g. original vs fixed).

Parameters (2) · required: before, after
ParameterTypeDescription
before requiredstring
after requiredstring

pixel_get_ascii

Get an exact text map of a region: one char per pixel, "." = transparent, plus a legend char→hex. Use it to count fingers/toes and plan precise edits.

Parameters (5) · required: path
ParameterTypeDescription
path requiredstring
regionobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_set_ascii

Write a text map onto the image at (x,y). Each char maps through legend (char → hex). "." = transparent, " " (space) = leave unchanged. Ideal for redrawing a hand/eye/foot exactly.

Parameters (9) · required: path, x, y, rows, legend
ParameterTypeDescription
path requiredstring
x requiredinteger
y requiredinteger
rows requiredarray of string
legend requiredmap of string
outstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_set_pixels

Set individual pixels.

Parameters (6) · required: path, pixels
ParameterTypeDescription
path requiredstring
pixels requiredarray of object
outstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_draw

Draw with the editor's engine. ops (applied in order): {type:"pixel",x,y} | {type:"pixels",pixels:[{x,y,color?}]} | {type:"line",x0,y0,x1,y1,pixelPerfect?} | {type:"polyline",points:[[x,y]...],closed?} | {type:"rect",x,y,w,h,filled?,radius?} | {type:"ellipse",x,y,w,h,filled?} | {type:"circle",cx,cy,r,filled?} | {type:"polygon",points,filled?} | {type:"triangle",x,y,w,h,filled?} | {type:"rotated_rect",cx,cy,w,h,angle,filled?} | {type:"curve",p0,p1,p2,p3 (Bezier [x,y])} | {type:"spray",cx,cy,radius,count,seed} | {type:"fill",x,y,tolerance?,contiguous?,diagonal?} | {type:"gradient",x0,y0,x1,y1,colors:[...],gradient:"linear"|"radial",dither:"none"|"bayer2"|"bayer4"|"bayer8",region?} | {type:"noise"|"voronoi",colors,region?,seed,scale?|size?} | {type:"text",x,y,text,font:"3x5"|"5x7",scale?} | {type:"erase",x,y,w,h}. Every op also takes: color, brush {type:"circle"|"square"|"line",size,angle}, ink "simple"|"alpha"|"copy"|"lock-alpha"|"shading"|"behind" (shading steps each pixel along its palette ramp: shade "darker"|"lighter"), opacity 0-255, only "all"|"color"|"opaque"|"empty" (+onlyColor), erase:true, snap:true (snap to palette).

Parameters (7) · required: path, ops
ParameterTypeDescription
path requiredstring
ops requiredarray of map of any
outstring
palettestring or array of stringpalette for shading ink / snap: preset name or hex list (default: the project palette, else the image colors)
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_select

Build a selection and SEE it before editing: returns the selection overlaid on the image (outside dimmed, edge outlined) plus pixel count and bounds. Pass the same select to any editing tool to limit its changes. Example: select a broken hand with {shapes:[{type:"wand",x:34,y:20,tolerance:24},{type:"rect",x:28,y:12,w:16,h:18,mode:"intersect"}]}.

Parameters (4) · required: path, select
ParameterTypeDescription
path requiredstring
select requiredanyselection spec (see the select parameter of editing tools)
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).

pixel_create

Create a new blank (or filled) canvas.

Parameters (4) · required: path, width, height
ParameterTypeDescription
path requiredstring
width requiredinteger
> 0
height requiredinteger
> 0
backgroundstringHex color like "#1a1020", or "transparent"

pixel_detect_grid

Detect the fake pixel size/offset of upscaled or upscaled "pixel art": periodicity detector cross-checked with a spectral-null FFT estimate, plus per-line fitting of uneven grids (irregularity 0 = perfectly uniform).

Parameters (5) · required: path
ParameterTypeDescription
path requiredstring
refine"dp" | "greedy" | "none"
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_repair_grid

One-shot cleanup of upscaled pixel art: snap to the true pixel grid, merge near-duplicate shades, reduce palette, remove orphan noise, optionally remove background and repair the outline. Returns a report + before/after preview.

Parameters (18) · required: path, out
ParameterTypeDescription
path requiredstring
out requiredstring
scale"auto" or numberfake pixel size; "auto" detects it
offsetXnumber
offsetYnumber
removeBackgroundboolean
bgTolerancenumber
maxColorsinteger
0–256
mergeThresholdnumber
≥ 0
palettestring or array of stringpreset name (pico-8, sweetie-16, endesga-32, resurrect-32, gameboy, nes) or hex list
orphansboolean
outlineboolean
refine"dp" | "greedy" | "none"grid line fitting: dp = fit every line to real edges (handles uneven/drifting uneven pixels, default), greedy = perfectPixel walk, none = uniform grid
sampler"mode" | "majority" | "median" | "center" | "average"how each cell picks its color (default mode; majority = 2-means keeping a real source color)
snapRadiusnumber
0.05–0.5
max line deviation as a fraction of a cell (default 0.3)
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_cleanup

Run cleanup passes in order. ops: remove_orphans | repair_outline | pixel_perfect | add_outline | remove_background | majority | merge_colors | harden_alpha.

Parameters (9) · required: path, ops
ParameterTypeDescription
path requiredstring
outstring
ops requiredarray of "remove_orphans" | "repair_outline" | "pixel_perfect" | "add_outline" | "remove_background" | "majority" | "merge_colors" | "harden_alpha"
outlineColorstringHex color like "#1a1020", or "transparent"
tolerancenumber
protectContrastnumber
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_parts

List procedural body-part generators, or preview one with params (returns its tone map + image). Tones: o outline, d shadow, b base, l light, w white, k pupil, s/S secondary.

Parameters (4) · required: action
ParameterTypeDescription
action required"list" | "preview"
namestring
paramsmap of any
rampmap of string

pixel_stamp_part

Replace a broken body part with a clean procedural one (exact finger count, clean outline, matching colors). Optionally erase the old part region first.

Parameters (15) · required: path, name, x, y
ParameterTypeDescription
path requiredstring
outstring
name requiredstringhand_open | fist | foot | eye | mouth | head
paramsmap of any
x requiredinteger
y requiredinteger
ramp"auto" or map of string"auto" = pick colors from the sprite (use rampRegion to sample around the old part), or an object {o: outline, d: shadow, b: base, l: highlight, w: white, k: pupil/dark, s: secondary, S: secondary shadow}
rampRegionobject
baseColorstringHex color like "#1a1020", or "transparent"
flipHboolean
scaleinteger
1–8
eraseRegionobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_draw_limb

Draw a clean arm/leg segment as a shaded capsule between two joint points (e.g. shoulder→elbow, elbow→wrist). Use to replace kinked, broken or uneven image limbs.

Parameters (13) · required: path, x0, y0, x1, y1, thickness
ParameterTypeDescription
path requiredstring
outstring
x0 requirednumber
y0 requirednumber
x1 requirednumber
y1 requirednumber
thickness requirednumber
1–32
ramp"auto" or map of string"auto" = pick colors from the sprite (use rampRegion to sample around the old part), or an object {o: outline, d: shadow, b: base, l: highlight, w: white, k: pupil/dark, s: secondary, S: secondary shadow}
rampRegionobject
baseColorstringHex color like "#1a1020", or "transparent"
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_mirror

Enforce left/right symmetry: mirror one half onto the other (optionally only inside a region). Great for fixing mismatched hands, feet and eyes on symmetric characters. Use pixel_analyze to find the symmetry axis.

Parameters (8) · required: path, direction
ParameterTypeDescription
path requiredstring
outstring
direction required"left-to-right" | "right-to-left"
axisXnumber
regionobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_copy_region

Copy a rectangle to another position, optionally mirrored horizontally (copy the good hand onto the bad one) and optionally clearing the source (move).

Parameters (11) · required: path, src, dstX, dstY
ParameterTypeDescription
path requiredstring
outstring
src requiredobject
dstX requiredinteger
dstY requiredinteger
mirrorboolean
clearSourceboolean
clearDestboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_palette

Palette operations. extract: list main colors + ramps. apply: map image to a palette (preset name or hex list). swap: replace colors (pairs [[from,to],...]). reduce: k-means to N colors. presets: list built-in palettes.

Parameters (11) · required: action
ParameterTypeDescription
pathstring
outstring
action required"extract" | "apply" | "swap" | "reduce" | "presets"
colorsinteger
2–256
palettestring or array of string
pairsarray of array of any
dither"none" | "bayer2" | "bayer4" | "floyd"
tolerancenumber
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_pixelize

Convert any image (photo, render, illustration) to pixel art: downsample, palette (auto or preset), dithering, outline.

Parameters (16) · required: path, out
ParameterTypeDescription
path requiredstring
out requiredstring
widthinteger
> 0
pixelSizenumber
> 0
method"mode" | "average" | "nearest" | "median-luma"
colorsinteger
2–256
palettestring or array of string
dither"none" | "bayer2" | "bayer4" | "floyd"
strengthnumber
0–1
outlineboolean or string
contrastnumber
saturationnumber
brightnessnumber
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_transform

Geometric transforms. op: rotate (RotSprite, clean pixel-art rotation; degrees) | flip_h | flip_v | rotate90 | scale2x | upscale (factor) | downscale (factor, nearest) | crop (region) | trim | resize_canvas (width,height,anchor) | shift (dx,dy,wrap).

Parameters (16) · required: path, op
ParameterTypeDescription
path requiredstring
outstring
op required"rotate" | "flip_h" | "flip_v" | "rotate90" | "scale2x" | "upscale" | "downscale" | "crop" | "trim" | "resize_canvas" | "shift"
degreesnumber
factorinteger
1–32
regionobject
widthinteger
heightinteger
anchorstring
dxinteger
dyinteger
wrapboolean
clockwiseboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_texture_rip

Extract a flat texture from a photo region seen in perspective (4 corner points: top-left, top-right, bottom-right, bottom-left), optionally seamless-tiling and pixelizing it.

Parameters (11) · required: path, out, quad, width, height
ParameterTypeDescription
path requiredstring
out requiredstring
quad requiredarray of array of any
min 4 items, max 4 items
width requiredinteger
> 0
height requiredinteger
> 0
seamlessboolean
pixelizeWidthinteger
> 0
colorsinteger
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_undo

Restore the previous version of a file (from automatic history snapshots).

Parameters (2) · required: path
ParameterTypeDescription
path requiredstring
stepsinteger
≥ 1

pixel_open_in_app

Open an image in the Isberg desktop editor (if it is running) so the user can watch and edit. The app auto-reloads files the agent changes.

Parameters (1) · required: path
ParameterTypeDescription
path requiredstring

pixel_auto_repair

One-click anatomy auto-repair for damaged / broken sprites. Steps (default: grid, isolate, pairs, noise, outline, replace): grid = Snap Upscaled art to its pixel grid (only when a grid is detected); isolate = Isolate the subject: drop background debris and background-only decoration colors; pairs = Paired parts: mirror the better hand / foot / eye onto the worse one (symmetric sprites); noise = Remove noise (orphan pixels, tiny fragments) inside detected parts; outline = Repair the outline locally around detected parts; replace = Rebuild hopeless hands procedurally (automatic only for confident, paired, very noisy parts; replaceAll forces it). Clean art is left alone (only real defects are touched). Returns what was fixed (with before/after boxes), the OPEN findings it did not fix (fix those by hand or with an instruction), and a before|after image with the detected part boxes (yellow hands, blue feet, pink eyes).

Parameters (10) · required: path
ParameterTypeDescription
path requiredstringImage or project file
outstringWhere to write the result (default: overwrite path). If the image grid snap changes the size, write to an image file.
stepsarray of "grid" | "isolate" | "pairs" | "noise" | "outline" | "replace"Which steps to run (default all except none); e.g. ["pairs","noise"]
replaceAllbooleanRebuild every detected hand procedurally, not only hopeless ones
handStyle"fist" | "hand_open"Procedural hand style for rebuilt hands (default fist)
forcePairsbooleanMirror paired parts even when neither is clearly better
dryRunbooleanReport + preview only, write nothing
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_find_parts

Detect anatomy parts: hands/fists (blobs at the ends of thin limbs, or outline-enclosed regions at the silhouette edge), feet (ground-contact blobs cut at the ankle), eyes (light blobs with dark pupils / pupils on a light face) with boxes, confidence, left/right side and pairs across the symmetry axis, plus quality metrics per part (noise, fragmentation, compactness, visible finger count). Returns an overlay image (yellow hands, blue feet, pink eyes, dotted symmetry axis). Use it before editing hands/feet/eyes, or to check pixel_auto_repair.

Parameters (5) · required: path
ParameterTypeDescription
path requiredstringImage or project file
kindsarray of "hand" | "foot" | "eye"
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_knowledge

Read the pixel-art knowledge base before drawing or reviewing: craft (proportions, shading, outlines, anatomy, color budgets), animation (timing presets, walk cycles, cells/pivots), tiles, cleanup (fixing generated art), critique (SHIP/FIX checklist), and more. Call with no topic to list topics.

Parameters (1)
ParameterTypeDescription
topicstring

pixel_properties_info

Inspect native user/extension properties on sprite, group, layer, cel, tag, slice, tileset or tile. Reports all native type descriptors; unsafe 64-bit integers remain decimal strings. Opaque maps are reported without discarding their bytes.

Parameters (2) · required: file
ParameterTypeDescription
file requiredstring
min length 1
targetobject

pixel_properties_edit

Set a typed native property, remove one, or clear one namespace, then save an editable .isbsprite document. Every official property type is supported, including nested maps/vectors, UUID and exact decimal int64. Unknown/invalid native maps are preserved and cannot be silently overwritten. Target indices are zero-based.

Parameters (7) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
targetobject
action required"set" | "remove" | "clear"
namestring
extensionstring
min length 1
propertyobject

pixel_view_grid

Exact text view of a sprite for planning edits: compact grid (one char per pixel, 0-9 A-Z = palette index, "." = transparent) under a column ruler, legend with hex + pixel counts, filled count, per-quadrant layout, plus a zoomed image with a grid (magenta every 4px). Counts as an inspection for pixel_export_checked.

Parameters (5) · required: path
ParameterTypeDescription
path requiredstringImage or project file (.png/.webp/.gif/.isbsprite)
frameinteger
≥ 0
regionobjectCrop before viewing (max 128x128)
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_critique

Run the critique engine: palette budget, near-duplicate colors, semi-alpha, isolated pixels, filler noise, edge padding / tiling, silhouette readability, outline consistency, symmetry, paired features, jaggies, pillow shading, banding, AA at small sizes, 1px anatomy. Returns SHIP/FIX with a FIX list (coordinates included) + the silhouette image. Counts as an inspection for pixel_export_checked.

Parameters (5) · required: path
ParameterTypeDescription
path requiredstringImage or project file (.png/.webp/.gif/.isbsprite)
type"item" | "prop" | "character" | "boss" | "block" | "tile" | "scene" | "freeform"Asset type for color budgets/padding/tiling rules (default: guessed — opaque → block/scene, else character ≥24px or item)
frameinteger
≥ 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_export_checked

Critique-gated export: writes the sprite (optionally upscaled) to out ONLY if pixel_critique / pixel_view_grid were called on the file after its last modification enough times (2 for ≤16px, 3 for bigger) and the latest critique says SHIP (or allowFix=true). Use it as the final step instead of copying files.

Parameters (7) · required: path, out
ParameterTypeDescription
path requiredstringImage or project file (.png/.webp/.gif/.isbsprite)
out requiredstringOutput PNG path
scaleinteger
1–32
frameinteger
≥ 0
allowFixbooleanExport even if the critique verdict is FIX (state why)
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pixel_color_profile

Inspect, assign, convert, or preview sprite colors using the bundled local Little CMS engine. Converts cel pixels, frame palettes, tilesets and off-canvas source planes; preserves alpha and indexed identity. Editable output is .isbsprite. Local ICC files and built-in sRGB/Display P3 profiles require no separate install.

Parameters (5) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
action required"inspect" | "assign" | "convert" | "preview"
profile"srgb" | "p3"
default "srgb"
iccFilestring

pixel_external_tilesets

Inspect external tileset references or resolve them from explicitly supplied local sprite files. Resolved tiles are embedded in the Isberg document and remain available when the sidecars are removed.

Parameters (3) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
resourcesmap of string

pixel_indexed_edit

Paint exact palette indices, edit a named palette slot, inspect native index identity, or synchronize linked source images. Preserves duplicate colors, each cel placement, off-canvas pixels and frame palettes. Coordinates and frame/layer indices are zero-based; outputs use Isberg formats.

Parameters (11) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
action required"inspect" | "paint" | "palette" | "synchronize"
frameinteger
≥ 0, default 0
layerinteger
≥ 0, default 0
pixelsarray of object
max 1000000 items
indexinteger
0–255
colorstring
namestring
xinteger
≥ 0
yinteger
≥ 0

pixel_lua_capabilities

Inspect the actual bundled Lua 5.4 interpreter and explicit partial Aseprite host API, including local modal Dialog widgets and the separate bounded local Plugin host. API41 completeness is not claimed.

No parameters.

pixel_lua_run

Run real Lua 5.4 on a local sprite document and save the active result. Source or a local .lua file; all sprite changes are committed only on success. Worker timeout bounds runaway code. Aseprite-compatible host subset is listed by pixel_lua_capabilities. Lua collections are 1-based; coordinates/palette entries are 0-based. Requires no desktop window or external installation.

Parameters (8)
ParameterTypeDescription
filestring
min length 1
Input .isbsprite, legacy .pforge/.aseprite import, or image; optional when source constructs a new Sprite
outstring
min length 1
Output .isbsprite/PNG/GIF; defaults to file, or .isbsprite for a legacy/reference input
sourcestring
max length 4194304
scriptFilestring
min length 1
paramsmap of string or number or boolean
timeoutMsinteger
50–30000
activeFrameinteger
≥ 1
activeLayerinteger
≥ 1

pixel_lua_ui

Run, begin, inspect status, or cancel Lua in the open Pixels editor. Use begin for scripts with modal dialogs: it returns a job id immediately; status polls its result. Run waits for completion within the bridge deadline. Cancel discards pending changes. Real local Lua worker, one undo step; File > Scripts also loads .lua files.

Parameters (6)
ParameterTypeDescription
action"run" | "begin" | "status" | "cancel"
default "run"
sourcestring
max length 4194304
scriptFilestring
min length 1
paramsmap of string or number or boolean
jobIdstring
timeoutMsinteger
50–25000

pixel_plugin_inspect

Read a local Lua script, script package directory/package.json, ZIP, or .aseprite-extension without executing source. Validate manifests, safe paths, UTF-8, ZIP CRC/headers and size bounds. Report actual supported Plugin APIs and explicit limitations. No installer, extraction, online fetch, native code or module loading.

Parameters (1) · required: packagePath
ParameterTypeDescription
packagePath requiredstring
min length 1

pixel_plugin_open

Initialize a local script package in a persistent real Lua worker and return sessionId, registered commands/menus, preferences and document summary. Commands retain Lua closure state until close/error. Optional file supplies the current sprite; otherwise a 32×32 sprite is used. No document or preference file is written by open/invoke/status; use pixel_plugin_save. At most 16 sessions.

Parameters (10) · required: packagePath
ParameterTypeDescription
packagePath requiredstring
min length 1
filestring
min length 1
Optional replacement current document; otherwise use the session document.
activeFrameinteger
≥ 1
activeLayerinteger
≥ 1
paramsmap of string or number or boolean
foregroundarray of integer
min 4 items, max 4 items
backgroundarray of integer
min 4 items, max 4 items
timeoutMsinteger
50–30000
preferencesmap of object
preferencesFilestring
min length 1
Read a bounded local JSON preferences object; mutually exclusive with preferences.

pixel_plugin_invoke

Invoke a registered command in a persistent headless Lua plugin session. Real onclick/onenabled/onchecked callbacks use the current sprite and shared preferences. Successful changes stay in memory until pixel_plugin_save. Error/timeout ends the worker and retains its last successful document/preferences for saving. Headless modal UI is unavailable; use pixel_plugin_ui for dialogs.

Parameters (9) · required: sessionId, commandId
ParameterTypeDescription
sessionId requiredstring
min length 1
commandId requiredstring
min length 1
filestring
min length 1
Optional replacement current document; otherwise use the session document.
activeFrameinteger
≥ 1
activeLayerinteger
≥ 1
paramsmap of string or number or boolean
foregroundarray of integer
min 4 items, max 4 items
backgroundarray of integer
min 4 items, max 4 items
timeoutMsinteger
50–30000

pixel_plugin_status

List local headless sessions, or inspect one session including command enabled/checked state and preferences. refresh=true evaluates callbacks against the optional current file; false reads the last successful state without executing Lua. Ended sessions retain their last successful result until close.

Parameters (9)
ParameterTypeDescription
sessionIdstring
min length 1
refreshboolean
default false
filestring
min length 1
Optional replacement current document; otherwise use the session document.
activeFrameinteger
≥ 1
activeLayerinteger
≥ 1
paramsmap of string or number or boolean
foregroundarray of integer
min 4 items, max 4 items
backgroundarray of integer
min 4 items, max 4 items
timeoutMsinteger
50–30000

pixel_plugin_save

Save the last successful active sprite and/or plugin preferences from a headless session. .isbsprite retains editable document metadata; preferences use atomic local JSON replacement. Can recover the last successful state after a callback error. Only the active sprite is saved; other open Lua sprites remain in memory.

Parameters (3) · required: sessionId
ParameterTypeDescription
sessionId requiredstring
min length 1
outstring
min length 1
Editable .isbsprite output for the active sprite.
preferencesOutstring
min length 1
Local .json output containing the current plugin preferences.

pixel_plugin_close

Run exit(plugin) in reverse script order, optionally save the final active sprite/preferences, then release the local session. Failed workers skip exit and can save their last successful state. If exit fails the session remains available for pixel_plugin_save/close. Without output paths the in-memory document is discarded; returned preferences remain inspectable in this response.

Parameters (4) · required: sessionId
ParameterTypeDescription
sessionId requiredstring
min length 1
outstring
min length 1
Editable .isbsprite output for the active sprite.
preferencesOutstring
min length 1
Local .json output containing the current plugin preferences.
timeoutMsinteger
50–30000

pixel_plugin_ui

Load, list, invoke, refresh, or unload local Lua extensions in the open Pixels editor. Uses persistent Lua workers, actual menu commands, local preferences and editor undo. dialogs reads open modeless window IDs, widgets, and live field values; dialog-event invokes real click/change/close, shades pick, file change or canvas mouse/key callbacks against the current sprite. Canvas mouse events require x/y; key events require key/code; shades uses colorIndex/button. Address a widget by widgetId or one-based widgetIndex (including anonymous controls). Use begin or dialog-begin for callbacks that may wait on a modal window, then status(jobId). Errors/cancellation end the plugin session and close its windows. Requires the desktop app; source is never executed by inspection.

Parameters (26) · required: action
ParameterTypeDescription
action required"load" | "list" | "invoke" | "begin" | "status" | "refresh" | "unload" | "dialogs" | "dialog-event" | "dialog-begin"
packagePathstring
min length 1
namestring
min length 1
commandIdstring
min length 1
jobIdstring
min length 1
dialogIdinteger
> 0
widgetIdstring
min length 1
widgetIndexinteger
1–256
event"click" | "change" | "close" | "mousedown" | "mouseup" | "mousemove" | "dblclick" | "wheel" | "keydown" | "keyup"
colorIndexinteger
1–256
buttoninteger
0–31
xnumber
-10000000–10000000
ynumber
-10000000–10000000
pressurenumber
0–1
deltaXnumber
deltaYnumber
keystring
max length 256
codestring
max length 64
repeatCountinteger
0–65535
altKeyboolean
ctrlKeyboolean
metaKeyboolean
shiftKeyboolean
spaceKeyboolean
datamap of object
timeoutMsinteger
50–25000

pixel_precision

Read/edit authoritative unsigned16 or linear float32 RGBA planes. Native16 PNG imports retain exact samples. paint/fill/exposure never route through an 8-bit image. display changes preview only. uint8 explicitly bakes the preview and discards high precision. All operations are local.

Parameters (14) · required: file
ParameterTypeDescription
file requiredstring
outstring
action"inspect" | "enable" | "read" | "paint" | "fill" | "exposure" | "float" | "display" | "uint8"
default "inspect"
mode"uint16" | "float32"
frameIndexinteger
≥ 0, default 0
layerIndexinteger
≥ 0, default 0
xinteger
≥ 0, default 0
yinteger
≥ 0, default 0
widthinteger
≥ 1, default 1
heightinteger
≥ 1, default 1
rgbaarray of number
min 4 items, max 4 items
stopsnumber
-24–24, default 0
exposurenumber
-24–24, default 0
toneMap"clip" | "reinhard"
default "clip"

pixel_precision_export

Export a chosen composited high-precision frame as PNG16 or uncompressed FLOAT32 OpenEXR. PNG float encodings reject out-of-range/gamut samples; no silent clamp or 8-bit conversion. EXR uses linear-sRGB, finite ±65504 RGB and 0..1 alpha.

Parameters (4) · required: file, out
ParameterTypeDescription
file requiredstring
out requiredstring
frameIndexinteger
≥ 0, default 0
encoding"source" | "srgb" | "linear" | "pq" | "hlg"

pixel_reference_cel

Inspect or set precise fractional reference-cel bounds, or render a projected local preview. Source pixels and source placements remain intact; reference layers are omitted from ordinary sprite exports.

Parameters (7) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
action required"inspect" | "set" | "preview"
frameinteger
≥ 0, default 0
layerinteger
≥ 0, default 0
boundsobject
scalenumber
> 0, ≤ 64, default 1

pixel_tile_copy

Copy or cut native tile cells to a local .isbtileclip, retaining IDs, all flip bits, selected empty cells, tile images, native index/depth data and tile metadata. Rect is in sprite pixels and selects every touched whole cell. Cut clears only placements, leaving shared tile content unchanged. With no rect, selects the complete tilemap. Frame/layer indices are zero-based.

Parameters (7) · required: file, clipboardOut
ParameterTypeDescription
file requiredstring
min length 1
frameinteger
≥ 0, default 0
layerinteger
≥ 0, default 0
rectobject
action"copy" | "cut"
default "copy"
clipboardOut requiredstring
min length 1
outstring
min length 1

pixel_tile_paste

Paste a local native tile clipboard into cells, a new tilemap layer, or a new sprite. Cross-tileset copy remaps IDs by exact native records and appends missing distinct tiles without changing destination tile contents. Supports X/Y flips and square-tile quarter turns. Size, palette/depth, external-resource and unsupported terrain/namespace conflicts fail explicitly. Saves editable .isbsprite only.

Parameters (13) · required: clipboardFile
ParameterTypeDescription
clipboardFile requiredstring
min length 1
filestring
min length 1
outstring
min length 1
frameinteger
≥ 0, default 0
layerinteger
≥ 0, default 0
as"cells" | "layer" | "sprite"
default "cells"
xinteger
-1048576–1048576
yinteger
-1048576–1048576
snapboolean
default false
flipXboolean
default false
flipYboolean
default false
turnsinteger
-3–3, default 0
namestring
max length 200

project_* · Sprite projects (.isbsprite): layers, frames, color modes, packing (7)

project_color_mode

Convert a project or image to a color mode, in place or to out. "indexed": map every cel to palette (hex list, palette file, image or preset name) or to an extracted palette of colors entries; "grayscale": luma (levels < 256 quantizes to that many grays); "rgb": unflag. dither: none | bayer2 | bayer4 | floyd. Linked cels stay linked. Returns the palette and a preview.

Parameters (12) · required: path, mode
ParameterTypeDescription
path requiredstring
mode required"rgb" | "indexed" | "grayscale"
palettearray of string or string
colorsinteger
2–256
indexed without palette: extract this many colors (default 32)
levelsinteger
2–256
grayscale levels (default 256 = no quantization)
dither"none" | "bayer2" | "bayer4" | "floyd"
strengthnumber
0–1
outstring
frameWidthinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

project_info

Describe a project: size, layers (opacity/blend/visibility/group/tilemap), groups (path, visible, opacity, blend, collapsed), frames (durations, linked cels), tags, slices with per-frame keys, tilesets + tilemap layers, palette.

Parameters (3) · required: path
ParameterTypeDescription
path requiredstringProject file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames)
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0

project_convert

Convert/save a project to another format by extension: .isbsprite, .gif, .png (multi-frame → sheet + JSON). Isberg .isbsprite preserves groups, tilemap layers and slice keys; PNG/GIF provide rendered game assets. Reference-tool formats are import-only.

Parameters (4) · required: path, out
ParameterTypeDescription
path requiredstringProject file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames)
out requiredstring
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0

project_view_frame

Render one frame (composited with blend modes/opacity/groups, or a single layer) zoomed with a pixel grid.

Parameters (6) · required: path
ParameterTypeDescription
path requiredstringProject file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames)
frameinteger
≥ 0
layerinteger
≥ 0
regionobject
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0

project_edit

Structural edits on a project, applied in order and saved (to out or in place). ops: {op:"add_layer",name,at?,blend?,opacity?,reference?,group?} | {op:"remove_layer",layer} | {op:"set_layer",layer,name?,visible?,opacity?,blend?,locked?,reference?,group?} | GROUPS (layer.group is a path like "Body/Arms"): {op:"group",layers:[...],group:"Body/Arms",visible?,opacity?,blend?,collapsed?} | {op:"ungroup",group} (children move up one level) | {op:"create_group",name,parent?,layers?,visible?,opacity?,blend?,locked?,collapsed?} (returns unique internal path; duplicate display names allowed) | {op:"move_group",group,parent?} | {op:"duplicate_group",group,name?} | {op:"move_layer",layer,delta} (within its parent) | {op:"delete_group",group} (including descendants, requires a surviving image layer) | {op:"set_group",group,name?(new path),label?(display name),visible?,opacity?,blend?,locked?,collapsed?} | {op:"add_frame",at?,copyFrom?} | {op:"remove_frame",frame} | {op:"move_frames",from,count?,to} (insert before ORIGINAL index to; tags/slice keys follow) | {op:"duration",frames:[...]|"all",ms} | {op:"reverse_frames",from,to} | {op:"add_tag",name,from,to,direction?,repeat?,color?} | {op:"remove_tag",name} | {op:"link_cels",layer,source,targets:[...]} | {op:"unlink_cel",frame,layer} | {op:"paste_image",path,frame,layer,x?,y?} (put an image file into a cel) | {op:"palette",colors:[hex...]} | {op:"color_mode",mode} | TILEMAPS (tile ids index the tileset, 0 = empty; flips X/Y/diag): {op:"add_tilemap_layer",name?,at?,tileW,tileH?,tileset?(existing id)} | {op:"convert_to_tilemap",layer,tileW,tileH?,tileset?,flips?(dedupe flipped tiles, default true)} | {op:"convert_to_layer",layer} | {op:"set_tile",layer,frame?,x,y (tile cell) | px,py (pixel),tile,flipX?,flipY?,diag?} | {op:"set_tiles",layer,frame?,tiles:[[x,y,tile,flips?]...]} | {op:"add_tiles",tileset,path} (cut an image into tiles and append) | {op:"autotile_set",tileset,tile,kind:16|47} | {op:"autotile_paint",layer,frame?,set,cells:[[x,y]...],erase?} | SLICE KEYS: {op:"slice_key",name,frame,bounds?,center?|null,pivot?|null} (key applies from frame until the next key; w/h 0 hides) | {op:"remove_slice_key",name,frame} | {op:"slice_keys",name,keys:[{frame,bounds,center?,pivot?}]}

Parameters (5) · required: path, ops
ParameterTypeDescription
path requiredstringProject file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames)
outstring
ops requiredarray of map of any
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0

project_pack

Pack a local project directory into one self-contained, hashed .isbundle JSON file. Includes selected local files; no external paths or services.

Parameters (3) · required: root, out
ParameterTypeDescription
root requiredstring
min length 1
out requiredstring
min length 1
filesarray of string
max 2000 items

project_unpack

Unpack and hash-check a local .isbundle (or legacy .gbundle) into a project folder. Validates all paths and hashes before writing; existing files need overwrite:true.

Parameters (3) · required: file, root
ParameterTypeDescription
file requiredstring
min length 1
root requiredstring
min length 1
overwriteboolean

palette_* · Palettes (4)

palette_ramp

Generate a hue-shifted color ramp from a base color (pixel-art-studio algorithm): shadows rotate toward blue (240°) and gain saturation, highlights rotate toward yellow (60°) and lose saturation; value runs linearly from v·(1-dark) to v+(1-v)·light; odd step counts keep the base color in the middle. Optionally write it as a palette file (.gpl/.hex/.pal/.act). Returns hex colors dark→light and a swatch image.

Parameters (6) · required: base
ParameterTypeDescription
base requiredstringBase color hex
stepsinteger
1–32
default 5
hueShiftnumber
0–180
max hue rotation in degrees, default 14
darknumber
0–1
how dark the darkest step gets, default 0.40
lightnumber
0–1
how light the lightest step gets, default 0.80
outstringOptional palette file to write (.gpl/.hex/.pal/.act)

palette_file

Read or write palette files. action "read": parse a .gpl (GIMP, entry names = roles) / .hex (Lospec) / .pal (JASC) / .act (Adobe) file, or collect the unique colors of an image/project. action "write": save colors (or the palette of from: file, image, project, or preset name) to out (format by extension). Use read+write to convert between formats.

Parameters (7) · required: action
ParameterTypeDescription
action required"read" | "write"
pathstringread: file to parse
colorsarray of stringPalette as hex colors ["#1a1c2c", ...]
fromstringwrite: take colors from this palette file / image / project / preset
namesarray of stringwrite .gpl: entry names (roles)
namestringpalette name (.gpl)
outstringwrite: output file .gpl/.hex/.pal/.act

palette_from_reference

Build a palette from a reference image: its exact colors if it has ≤ N, otherwise median cut to N colors; sorted dark→light (luma). Optionally saves a palette file. Use it to match a reference art style.

Parameters (6) · required: path
ParameterTypeDescription
path requiredstringReference image (or project)
colorsinteger
1–256
N, default 16
outstringOptional .gpl/.hex/.pal/.act
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

palette_used

Compare an image/project with a palette: which entries are used, which are unused, and which image colors are not in the palette (with pixel counts). Without palette, uses the project palette (doc.palette).

Parameters (6) · required: path
ParameterTypeDescription
path requiredstring
palettearray of string or string
frameWidthinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

style_* · Art styles (3)

style_study

Study a reference sprite's RENDERING style: true size/detected upscale, opaque/transparent/semi-alpha counts, palette with counts, value range, ramps by hue (30° buckets), dither score, outline darkness + edge colors, imperative do/don't notes. Returns the silhouette (flat dark on cream).

Parameters (4) · required: path
ParameterTypeDescription
path requiredstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

style_save

Save a style card (name, notes, palette, ramps, metrics, thumbnail) to the style library shared with the desktop app (the styles folder in the portable Data folder, or in GAMEBENCH_PROFILE; GAMEBENCH_STYLES overrides it). Notes default to generated do/don't rules (always incl. "Do NOT copy").

Parameters (7) · required: path, name
ParameterTypeDescription
path requiredstring
name requiredstring
notesarray of string
dirstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

style_list

List saved style cards (name, palette, notes); with name returns that card's prompt text to follow when drawing.

Parameters (2)
ParameterTypeDescription
namestring
dirstring

spec_* · Sprite specs and templates (2)

spec_render

Render a sprite SPEC (art as code: JSON of shapes + color ramps → shaded, outlined layers; frames = poses) to a project/PNG. Format: {size:[w,h], margin, fit:"auto"|"canvas"|"union", pivot:[x,y], outline, ramps:{name:{o,d,b,l}|"#base"|["#dark",…,"#light"]}, params:{}, layers:[{name, parts:[{name, ramp, shape:"rect|ellipse|circle|capsule|polygon|triangle|pixels|ascii|part", …params | shapes:[…], clip, light, outline, flat, z, pivot}]}], frames:[{duration, tag, params, pose:{part|layer|"*": {dx,dy,rotate,scale,flip,hide,…param overrides; values may be expressions like "-bob*2"}}}], actions:[{tag, frames, duration(s), keys:{param:[per-frame]|{i:v}}, pose}]}. Example: examples/specs/ninja.json, slime.json. Returns a preview of all frames.

Parameters (4)
ParameterTypeDescription
specmap of any or string
filestring.json / .pfspec.json spec file
outstring.isbsprite/.png (sheet + json)/.gif
zoominteger
1–16

spec_template

Generate a character base SPEC from a proportion preset (puppet layers legL/legR/body/armL/armR/head/hair/face, idle + walk actions). Returns the spec JSON (edit it, then spec_render) and a preview. walkSet=true → 4-direction walk project (walk_down/up/left/right; left = mirrored right).

Parameters (10) · required: preset
ParameterTypeDescription
preset required"chibi" | "heroic" | "tall" | "realistic"chibi: head 40–50% (32x32 row budget); heroic: 1/3–1/4 head; tall: tactical 48–64px; realistic: 1/6–1/8
facing"front" | "three-quarter" | "side" | "back"
sizeinteger
16–128
height in px (width follows the preset ratio)
colorsmap of string{skin, hair, outfit, pants, accent, boots, glove, outline} hex; skin may be pale|light|tan|brown|dark|green
hand"fist" | "glove" | "hand"
feet"boot" | "shoe" | "bare"
hair"short" | "long" | "spiky" | "bald"
outstringsave the spec JSON here (.json)
renderstringalso render to this project/PNG
walkSetstringsave a 4-direction walk set project here (.isbsprite/.png/.gif)

pxl_* · PXL art as code (8)

pxl_build

Build a PXL art file ("pixel art as code": sprites, scenes, anims, sheets) like claude-pxl build: writes out/sprites, out/scenes, out/anims (strip + Aseprite-style JSON with durations/frameTags + GIF), sheets (TexturePacker hash JSON), *_n.png normal maps and out/_preview (upscaled, checkerboard = transparent, pixel grid, darker every 8). Returns errors with file:line:col and did-you-mean hints (one broken asset does not stop the others) plus preview images — LOOK at them, then patch small things and rebuild with only. Read pixel_knowledge topic "pxl" first.

Parameters (7)
ParameterTypeDescription
pathstringArt file (.px.js). Relative paths resolve against the workspace.
sourcestringInline PXL source instead of a file (include() resolves against the workspace).
outstringOutput dir (default <art dir>/out, or <workspace>/pxl-out for inline)
onlyarray of stringOnly these assets/sheets (fast iteration)
seedinteger
scaleinteger
> 0
Fixed preview scale
previewsinteger
0–12
How many preview images to return (default 4)

pxl_ascii

Exact text view of one PXL asset: palette keys per pixel with tens/ones x rulers and y labels ("." transparent, "?" off-palette). Anims print every frame with its duration in ms. Cheaper than an image for precise grid(x, y, ...) patches.

Parameters (3) · required: name
ParameterTypeDescription
pathstringArt file (.px.js). Relative paths resolve against the workspace.
sourcestringInline PXL source instead of a file (include() resolves against the workspace).
name requiredstring

pxl_list

List the assets (sprite/scene/anim, parts start with "_"), groups and sheets of a PXL file with their file:line locations.

Parameters (2)
ParameterTypeDescription
pathstringArt file (.px.js). Relative paths resolve against the workspace.
sourcestringInline PXL source instead of a file (include() resolves against the workspace).

pxl_to_project

Turn a PXL asset into an Isberg project: layers (layers:true → doc layers; shade/light blend layers baked), anim frames with per-frame durations + frame tag, palette and ramps. Saves by extension (.isbsprite, .gif, .png sheet+json) so it can be edited in Isberg or used as rendered game assets.

Parameters (5) · required: name, out
ParameterTypeDescription
pathstringArt file (.px.js). Relative paths resolve against the workspace.
sourcestringInline PXL source instead of a file (include() resolves against the workspace).
name requiredstring
out requiredstring.isbsprite | .gif | .png
seedinteger

pxl_lighting

Grid-based cell lighting on an existing sprite/scene image: lamps (reach r px, color, power, height z), ambient, sky light from the top, opaque pixels block light (solid), emit colors stay full-bright, optional normals ("dome"|"bevel"|"luma") so surfaces facing lamps brighten. Writes the lit image (and light map).

Parameters (18) · required: path
ParameterTypeDescription
path requiredstring
outstring
lampsarray of object
ambientnumber
0–1
ambientColorstring
skynumber
≥ 0
skyColorstring
cellinteger
> 0
smoothboolean
blocknumber
0–1
emitarray of string
solidboolean
normals"dome" | "bevel" | "luma"
depthnumber
lightMapstringAlso save the light map here
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pxl_normals

Normal map of a sprite for engine lights (Godot/Unity encoding: RGB = n*0.5+0.5, green up, flat #8080ff): "dome" (blobs bulge), "bevel" (edges slope over w px), "luma" (lighter = higher). on limits it to some colors (others act as edges: bevel each brick). Writes <name>_n.png by default.

Parameters (9) · required: path
ParameterTypeDescription
path requiredstring
outstring
shape"dome" | "bevel" | "luma"
depthnumber
winteger
> 0
onarray of string
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pxl_glow

Glow halos around pixels of key colors (flames, potions, moons, neon). Color mode screens the glow color over neighbours (leaves the palette); ramp: n steps neighbours up to n shades lighter along ramps instead (stays in the palette). Give glowing things their own colors.

Parameters (13) · required: path, colors
ParameterTypeDescription
path requiredstring
outstring
colors requiredarray of string
rnumber
> 0
strengthnumber
colorstring
bandsinteger
rampinteger
> 0
rampsarray of array of stringRamps dark → light (ramp mode; default: auto from the image colors)
whereobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

pxl_shade

Step colors darker (shade) or lighter (light) along palette ramps inside a region, ordered-dithered to density (stack density 0.5 big + 1.0 small for soft halo + solid core). Ramps default to auto ramps from the image colors.

Parameters (10) · required: path
ParameterTypeDescription
path requiredstring
outstring
mode"shade" | "light"
stepsinteger
> 0
densitynumber
0–1
regionobject or array of number
rampsarray of array of string
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

lpc_* · LPC character parts (2)

lpc_place

Place a frame image into an LPC universal sheet (832x1344, 64x64 cells, 13x21; rows by action, directions up,left,down,right). Actions: spellcast 7f, thrust 8f, walk 9f (frame 0 = idle), slash 6f, shoot 13f, hurt 6f (down only). The frame is cropped to its bbox, centered, feet on y=58; error if larger than 64px. Creates the sheet if missing; writes <sheet>.json.

Parameters (6) · required: sheet, action, dir, frame, image
ParameterTypeDescription
sheet requiredstringLPC sheet .png (created if missing)
action required"spellcast" | "thrust" | "walk" | "slash" | "shoot" | "hurt"
dir required"up" | "left" | "down" | "right"
frame requiredinteger
0–12
image requiredstringframe image (or project → its first frame)
sourceFrameinteger
≥ 0

lpc_export

Export a project to an LPC universal sheet + JSON: tags named <action>_<dir> (walk_down, slash_left, spellcast_up, hurt…; no dir = down) fill their rows; a missing left/right row is mirrored from the other side. Optional gif of one row.

Parameters (6) · required: path, out
ParameterTypeDescription
path requiredstringProject/image: .isbsprite, .png (sheet with frameWidth), .gif
out requiredstring.png
gifobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

slices_* · Slices (2)

slices_edit

Add / update / remove / duplicate slices (named rects with color, 9-slice center and pivot RELATIVE to bounds, user data) in a project. Saves to .isbsprite (slices persist there; plain PNG cannot hold slices). ops: {op:"add",name,bounds,center?,pivot?,color?,userData?} | {op:"update",name,newName?,bounds?,center?|null,pivot?|null,...} | {op:"remove",name} | {op:"duplicate",name,dx?,dy?} | {op:"clear"} | PER-FRAME KEYS: add/update accept keys:[{frame,bounds,center?,pivot?}] (replace all keys); update with frame edits the key at that frame; {op:"key",name,frame,bounds?,center?,pivot?} | {op:"remove_key",name,frame}

Parameters (6) · required: path, ops
ParameterTypeDescription
path requiredstring
outstring
ops requiredarray of object
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

slices_export

Export every slice of a project as its own PNG (<outDir>/<name>.png, optional integer scale), plus slices.json (Aseprite meta.slices). nineSlice {w,h} also renders each slice that has a 9-slice center at that size (<name>@WxH.png).

Parameters (7) · required: path, outDir
ParameterTypeDescription
path requiredstring
outDir requiredstring
frameinteger
≥ 0
scaleinteger
1–16
nineSliceobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

Animation

Generate, fix and export sprite animation.

anim_* · Sprite animation and sheets (12)

anim_view

View all frames of a horizontal (or grid) sprite sheet with frame numbers, plus per-frame change stats that flag broken/jittery frames.

Parameters (6) · required: path, frameWidth
ParameterTypeDescription
path requiredstring
frameWidth requiredinteger
> 0
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_fix

Fix an animation sprite sheet: stabilize (stop jitter / sliding feet), unify palette (stop color flicker), remove single-frame flicker noise.

Parameters (12) · required: path, frameWidth
ParameterTypeDescription
path requiredstring
outstring
frameWidth requiredinteger
> 0
frameHeightinteger
> 0
stabilizeboolean
anchor"bottom-center" | "center" | "top-center"
unifyPaletteboolean
maxColorsinteger
removeFlickerboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_generate

Generate a simple looping animation sheet from one clean sprite: idle-bob | breathe | squash | shake | float | walk-bounce.

Parameters (8) · required: path, out, type
ParameterTypeDescription
path requiredstring
out requiredstring
type required"idle-bob" | "breathe" | "squash" | "shake" | "float" | "walk-bounce"
framesinteger
2–32
amplitudenumber
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_build_sheet

Combine separate frame images into one sprite sheet.

Parameters (3) · required: frames, out
ParameterTypeDescription
frames requiredarray of string
min 1 items
out requiredstring
columnsinteger

anim_export_gif

Export a sprite sheet as an animated GIF.

Parameters (9) · required: path, out, frameWidth
ParameterTypeDescription
path requiredstring
out requiredstring
frameWidth requiredinteger
> 0
frameHeightinteger
> 0
fpsnumber
> 0
scaleinteger
1–16
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_action

Create an action from a timing preset: inserts N copies of a source frame with preset durations and a tag. Presets: idle (2–4 frames @ 200–400ms); walk (4 (6) frames @ 100–150ms); walk6 (6 frames @ 100–150ms); run (6–8 frames @ 60–100ms); attack (3–6 frames: windup 100–150 / strike 40–60 / impact hold 80–120 / recover 100–150); jump (4–6 frames: crouch 100, launch 50, rise 80, peak 150–200, fall 80, land 100); hurt (2 frames @ 60–80ms); death (4–6 frames @ 100–150ms). Then edit the frames (poses).

Parameters (11) · required: path, action
ParameterTypeDescription
path requiredstringProject/image: .isbsprite, .png (sheet with frameWidth), .gif
action required"idle" | "walk" | "walk6" | "run" | "attack" | "jump" | "hurt" | "death"
frominteger
≥ 0
framesinteger
1–16
tagstring
outstring
frameWidthinteger
> 0
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_walk_cycle

Walk cycle from puppet LAYERS (names like legL/legR/body/head/armL/armR/hair/cape): 4 frames contact(y+0)/passing(y−1)/mirrored, stride ±2px at 32px (scaled), head lags 1 frame, hair/cape use the previous body offset. With directions ({down, up, right, left} = source frame per facing) builds a 4-direction set tagged walk_<dir> (missing left = mirrored right). Use anim_auto_puppet first for a flat sprite.

Parameters (8) · required: path
ParameterTypeDescription
path requiredstringProject/image: .isbsprite, .png (sheet with frameWidth), .gif
frameinteger
≥ 0
view"side" | "front"
strideinteger
1–8
directionsmap of integer
outstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_auto_puppet

Split one sprite into puppet layers for the walk generator: user rules [{layer, colors:[hex], tolerance?, region?}] first, then defaults: red/accent pixels in the top third → "plume", non-cloth pixels below 83% height split at mid-x → legL/legR, rest → body. Saves a layered project.

Parameters (9) · required: path, out
ParameterTypeDescription
path requiredstringProject/image: .isbsprite, .png (sheet with frameWidth), .gif
frameinteger
≥ 0
rulesarray of map of any
legLinenumber
0.5–0.98
plumeboolean
out requiredstring.isbsprite output
walk"side" | "front"also append a walk cycle
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_fx

Motion helpers on a frame: squash (1px, feet planted) | stretch | anticipation (held crouch BEFORE the frame) | impact (hold + 1px whole-sprite shake) | flash (1-frame palette flash, default white).

Parameters (9) · required: path, op, frame
ParameterTypeDescription
path requiredstringProject/image: .isbsprite, .png (sheet with frameWidth), .gif
op required"squash" | "stretch" | "anticipation" | "impact" | "flash"
frame requiredinteger
≥ 0
amountinteger
1–8
colorstring
msinteger
≥ 10
outstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_autoslice

Auto-slice a sprite sheet by empty (transparent) column/row gaps into frames, put them in equal cells with feet on a common ground line, centered. Saves a multi-frame project (one tag per sheet row).

Parameters (7) · required: path, out
ParameterTypeDescription
path requiredstringsheet image
minGapinteger
≥ 1
padinteger
≥ 0
out requiredstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_align_ground

Align all frames: feet on the deepest common ground line and centered horizontally (offsets applied to every layer of a frame).

Parameters (8) · required: path
ParameterTypeDescription
path requiredstringProject/image: .isbsprite, .png (sheet with frameWidth), .gif
centerXboolean
outstring
frameWidthinteger
> 0
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

anim_validate

Validate an animation: union bbox + pivot (fixed cell for the action), edge failures (opaque px within margin px of the cell edge per frame), per-frame bbox/colors/ground line, issues list. Optional cropUnion saves frames cropped to the union cell (+pad).

Parameters (9) · required: path
ParameterTypeDescription
path requiredstringProject/image: .isbsprite, .png (sheet with frameWidth), .gif
margininteger
0–8
cropUnionstringsave the union-cell cropped project here
padinteger
≥ 0
frameWidthinteger
> 0
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

Image processing, sheets and tiles

Filters, sprite-sheet import/export, video conversion, tilesets and tilemaps.

fx_* · Image effects and filters (7)

fx_filter

Apply an Aseprite-style filter to an image or a whole project (all frames/layers by default, or chosen frames/layers/region). filters: replaceColor{from,to,tolerance} · invert{alpha} · brightnessContrast{brightness,contrast} · hueSaturation{mode:hsl|hsv,multiplicative,hue,saturation,lightness,alpha} · colorCurve{curves} · convolution{preset:blur|gaussian|gaussian-5x5|box-blur-5x5|sharpen|sharpen-strong|edge|edge-laplacian|emboss|sobel-x|sobel-y,matrix,divisor,bias,alpha,wrap,snap:|image|palette} · despeckle{width,height} · outline{color,place:outside|inside,matrix:circle|square|horizontal|vertical} · selout{light:top-left|top|top-right|left|right|bottom-left|bottom|bottom-right,outline,matrix:circle|square} · shiftedShade{mode:shape|regions,ramp,base,shades,dx,dy,outline:keep|none} · gradientMap{ramp,normalize,sortRamp} · posterize{levels,colors,dither:none|bayer2|bayer4|floyd}. Colors are hex. colorCurve: params.curves {rgb|r|g|b|a: [[x,y],...]} or points+channel. convolution: preset or matrix ("0 -1 0; -1 5 -1; 0 -1 0" or 3x3/5x5 array), snap:"image" or a hex palette list to snap results back. selout: lit-side edge pixels take the mid shade of the adjacent ramp. shiftedShade: darkest silhouette + lighter copies offset by (dx,dy) toward the light.

Parameters (12) · required: path, filter
ParameterTypeDescription
path requiredstring
outstring
filter required"replaceColor" | "invert" | "brightnessContrast" | "hueSaturation" | "colorCurve" | "convolution" | "despeckle" | "outline" | "selout" | "shiftedShade" | "gradientMap" | "posterize"
paramsmap of any
frames"all" or array of integerframes to process (default all)
layers"all" or array of integerlayers to process (default all)
regionobjectonly change pixels inside this rectangle (the filter still sees the whole cel)
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

fx_transform

Whole-sprite transforms on an image or project (every frame and layer, linked cels kept). ops: sprite_size {width?,height?,percent?,method: nearest|bilinear|rotsprite|scale2x|scale3x|epx} · canvas_size {left,top,right,bottom (negative removes)} · crop {region} · trim · trim_grid {grid?:{x,y,w,h}} · rotate {degrees: 90|-90|180} · flip {axis:h|v} · shift {dx,dy,region?} (wraps around; cels only).

Parameters (22) · required: path, op
ParameterTypeDescription
path requiredstring
outstring
op required"sprite_size" | "canvas_size" | "crop" | "trim" | "trim_grid" | "rotate" | "flip" | "shift"
widthinteger
> 0
heightinteger
> 0
percentnumber
> 0
method"nearest" | "bilinear" | "rotsprite" | "scale2x" | "scale3x" | "epx"
leftinteger
topinteger
rightinteger
bottominteger
regionobject
gridobject
degreesnumber
axis"h" | "v"
dxinteger
dyinteger
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

fx_cleanup_extra

pixel-art-studio cleanup passes, applied in order to every frame/layer: strip_checker (fake transparency checkerboard: light-gray pixels / 2-color tiles connected to the border) · dehalo (gray matte fringe on edges → neighbor average) · despeckle_clusters (remove opaque blobs < minSize px) · dedupe (merge colors within Chebyshev tolerance onto the most-used one) · harden_steps (snap alpha to steps, e.g. [0,64,160,255]).

Parameters (15) · required: path, ops
ParameterTypeDescription
path requiredstring
outstring
ops requiredarray of "strip_checker" | "dehalo" | "despeckle_clusters" | "dedupe" | "harden_steps"
min 1 items
minSizeinteger
≥ 1
tolerancenumber
≥ 0
stepsarray of integer
checkerMode"connected" | "all"
frames"all" or array of integerframes to process (default all)
layers"all" or array of integerlayers to process (default all)
regionobjectonly change pixels inside this rectangle (the filter still sees the whole cel)
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

fx_detect_scale

Detect the pixel scale of an upscaled / image image: exact integer upscale test (nearest down→up identical), run-length estimate, and the grid detector. Use the exact scale with fx_transform sprite_size (nearest) to recover the original sprite losslessly.

Parameters (5) · required: path
ParameterTypeDescription
path requiredstring
minOutinteger
≥ 1
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

fx_pixelpipe

Full image-art cleanup pipeline (pixel-art-studio pixelpipe): strip checker → detect scale (exact first) + downscale → harden alpha → despeckle → dedupe → dehalo → palette lock/limit. Writes clean.png, [email protected], before_after.png, palette.png, report.json and recipe.json (re-runnable with fx_apply_recipe or the Batch tool) into outDir. Pass recipe to run a custom recipe instead.

Parameters (17) · required: path, outDir
ParameterTypeDescription
path requiredstring
outDir requiredstring
stripCheckerboolean
exactFirstboolean
scale"auto" or number"auto" (default) or force a pixel size
repairGridmap of anyuse pixel_repair_grid-style options instead of the autoScale step
hardenStepsarray of integer
despeckleinteger
≥ 0
dedupenumber
≥ 0
dehaloboolean
maxColorsinteger
0–256
palettestring or array of stringpreset name or hex list to lock to
upscaleinteger
1–32
recipeany
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

fx_apply_recipe

Run a recipe ({version:1, steps:[{op, params}]}) on an image (or every frame/layer of a project). recipe = object or path to recipe.json. ops: repairGrid, autoScale, downscale, upscale, spriteSize, resample, stripChecker, removeBg, hardenAlpha, hardenSteps, despeckle, dedupe, dehalo, orphans, mergeShades, quantize, outline, repairOutline, filter, trim, rotate, flip, recolor. Size-changing ops (autoScale, downscale, repairGrid…) require a single image input.

Parameters (8) · required: path, out, recipe
ParameterTypeDescription
path requiredstring
out requiredstring
recipe requiredstring or map of any
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

fx_variants

Palette-swap variants: group the sprite colors into ramps (hue + luminance) and map each ramp positionally onto another ramp, so shading is preserved. Modes: hueShifts [deg...] · palette (preset name or hex list → its ramps are the target pool) · targetRamps [[hex dark→light]...] · variants (explicit target ramps per source ramp). Writes <outDir>/variant_NN.png (frames as a horizontal sheet for projects), variants_sheet.png and variants.json (color maps).

Parameters (13) · required: path, outDir
ParameterTypeDescription
path requiredstring
outDir requiredstring
countinteger
1–32
hueShiftsarray of number
palettestring or array of string
targetRampsarray of array of string
variantsarray of array of array of string
keepGraysboolean
frameWidthinteger
> 0
Treat a PNG as a sprite sheet with this frame width
frameHeightinteger
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

io_* · Image import/export and sprite sheets (5)

io_export

Export a project/image like Aseprite "Export As": format by out extension or format (png, png-sequence, apng, gif, webp, webp-animated, jpeg, tiff, avif, svg, css (box-shadow + sample .html), isbsprite, preview (checker + grid)). APNG preserves native indexed slots where provable, rational imported delays and loop count; reports explicit RGB/RGBA fallback. Use tokens in out for sequences: {title} {layer} {tag} {frame} {tagframe} {frame001} (e.g. "out/{title}-{tag}-{tagframe01}.png"). PNGs are written indexed when ≤256 colors (indexed:false forces RGBA). GIF/JPEG can be composited on background. Returns the written files and a preview.

Parameters (20) · required: path, out
ParameterTypeDescription
path requiredstringProject or image: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), .png/.apng (native indexed animation), .gif/.webp (animated → frames), .jpg/.tiff/.avif
out requiredstring
format"png" | "png-sequence" | "gif" | "apng" | "webp" | "webp-animated" | "jpeg" | "tiff" | "avif" | "gbsprite" | "svg" | "css" | "preview"
scaleinteger
1–64
Integer upscale (nearest)
areastring or objectSlice name or {x,y,w,h}; default whole canvas
layers"visible" or "all" or integer or string or array of integer or string"visible" (default), "all", a layer index/name or a list
splitLayersbooleanEach layer separately
splitTagsbooleanEach tag separately (direction honored)
frames"all" or integer or array of integer"all" (default), a frame index or list
tagstringOnly this tag's frames, in its playback direction
frominteger
tointeger
direction"tag" | "forward" | "reverse" | "pingpong" | "pingpong-reverse"Default "tag" = each tag's own direction
frameWidthinteger
> 0
Treat a single image as a sheet with this cell width
frameHeightinteger
> 0
backgroundstringHex color to composite onto (GIF/JPEG/any)
qualityinteger
1–100
indexedboolean
titlestring
loopinteger
0–4294967295
APNG play count: 0 infinite; omitted retains imported count

io_sheet

Export a sprite sheet with full Aseprite options + engine data. type horizontal|vertical|rows|columns|packed (MaxRects); constraints columns/rows/width/height; borderPadding, shapePadding (spacing), innerPadding; trim "cel" (per frame, spriteSourceSize offsets) or "sprite" (union); extrude (px); mergeDuplicates; ignoreEmpty; powerOfTwo; splitLayers / splitTags (+ groupRows: each group on its own row, or splitSheets: one sheet per group). data: path of the data file; dataFormat json-hash (default) | json-array | texturepacker (frames by name + animations) | godot (SpriteFrames .tres with AtlasTexture regions, FPS from durations) | phaser (array JSON + loader notes) | unity (JSON + import notes). filenameFormat for frame names, e.g. "{title}-{tag}-{tagframe}.png".

Parameters (34) · required: path, out
ParameterTypeDescription
path requiredstringProject or image: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), .png/.apng (native indexed animation), .gif/.webp (animated → frames), .jpg/.tiff/.avif
out requiredstringSheet PNG path
scaleinteger
1–64
Integer upscale (nearest)
areastring or objectSlice name or {x,y,w,h}; default whole canvas
layers"visible" or "all" or integer or string or array of integer or string"visible" (default), "all", a layer index/name or a list
splitLayersbooleanEach layer separately
splitTagsbooleanEach tag separately (direction honored)
frames"all" or integer or array of integer"all" (default), a frame index or list
tagstringOnly this tag's frames, in its playback direction
frominteger
tointeger
direction"tag" | "forward" | "reverse" | "pingpong" | "pingpong-reverse"Default "tag" = each tag's own direction
frameWidthinteger
> 0
Treat a single image as a sheet with this cell width
frameHeightinteger
> 0
datastring
dataFormat"json-hash" | "json-array" | "texturepacker" | "godot" | "phaser" | "unity" | "none"
type"horizontal" | "vertical" | "rows" | "columns" | "packed"
columnsinteger
≥ 0
rowsinteger
≥ 0
widthinteger
≥ 0
heightinteger
≥ 0
borderPaddinginteger
≥ 0
shapePaddinginteger
≥ 0
innerPaddinginteger
≥ 0
trimboolean or "cel" | "sprite"
extrudeinteger
0–8
mergeDuplicatesboolean
ignoreEmptyboolean
powerOfTwoboolean
groupRows"layer" | "tag" | "group"
splitSheetsboolean or "layer" | "tag" | "group"
filenameFormatstring
resPathstringGodot texture path prefix, default res://
titlestring

io_import_sheet

Import a sprite sheet image into a multi-frame project (Aseprite "Import Sprite Sheet"): type rows|columns|horizontal|vertical, cell x/y/w/h, padX/padY between cells, partial cells, ignoreEmpty. Saves to out (.isbsprite/.gif/...).

Parameters (14) · required: path, out, w, h
ParameterTypeDescription
path requiredstringSheet image
out requiredstring
type"rows" | "columns" | "horizontal" | "vertical"
xinteger
≥ 0
yinteger
≥ 0
w requiredinteger
> 0
h requiredinteger
> 0
padXinteger
≥ 0
padYinteger
≥ 0
partialboolean
ignoreEmptyboolean
durationinteger
> 0
maxinteger
≥ 0
tagsarray of object

io_import_sequence

Import an image sequence (list of files and/or folders, sorted naturally) as frames of one project; different sizes are placed on the largest canvas (anchor). Animated inputs contribute all their frames.

Parameters (4) · required: paths, out
ParameterTypeDescription
paths requiredarray of string
min 1 items
out requiredstring
durationinteger
> 0
anchor"top-left" | "center" | "bottom"

io_batch

Run a re-runnable recipe on every image/project in a folder (or a list of files) and write the results (pixelpipe-style regenerable build). recipe: {version:1, steps:[{op, params}]} or a path to a recipe .json. Ops: repairGrid, pixelize, palette, quantize, removeOrphans, repairOutline, removeBackground, hardenAlpha, mergeSimilarColors, scale, scale2x, resize, trim, outline, plus FX ops: autoScale, downscale, upscale, spriteSize, resample, stripChecker, removeBg, hardenSteps, despeckle, dedupe, dehalo, orphans, mergeShades, filter, rotate, flip, recolor. Output name template uses {title} (input name) and {index}; format by extension (png, gif, webp, isbsprite, ...).

Parameters (6) · required: input, outDir, recipe
ParameterTypeDescription
input requiredstring or array of stringFolder or list of files
outDir requiredstring
recipe requiredstring or map of any or array of map of any
filenamestringOutput name template, default "{title}.png"
palettestringShortcut: append an "apply palette" step (preset name or palette file)
scaleinteger
≥ 1
Export upscale

video_* · Video to pixel art (1)

video_to_pixel

Turn a video clip (mp4/webm/mov/mkv… via FFmpeg) or an animated GIF/WebP into a pixel-art animation: sample frames at fps between start/end, downsample to width px, quantize ALL frames to one shared palette (auto or preset), optional dithering, background removal and single-frame flicker removal. Saves a .isbsprite project, an animated .gif, or a .png sprite sheet (+JSON). Then edit it with project_* / anim_* tools.

Parameters (12) · required: path, out
ParameterTypeDescription
path requiredstringvideo or animated image file
out requiredstringoutput: .isbsprite | .gif | .png (sheet)
startnumber
≥ 0
seconds (default 0)
endnumber
≥ 0
seconds (default start + 3, or the end of the clip)
fpsnumber
> 0, ≤ 30
sampled frames per second (default 8)
widthinteger
8–512
output width in pixels (default 96)
colorsinteger
2–256
shared palette size when no palette is given (default 16)
palettestring or array of stringpreset name or hex list
dither"none" | "bayer2" | "bayer4" | "floyd"
removeBackgroundboolean
removeFlickerbooleandefault true
maxFramesinteger
1–600
cap (default 120)

texture_* · Texture fill and scatter (2)

texture_fill

Fill a region of an image (or a project cel) with a procedural pixel-art texture. kind: "noise" (Texel hash noise over colors, seed, scale<1 = bigger clumps) | "noise_circle" (cx, cy, r) | "voronoi" (cells, border color, wrap) | "dither" (two colors c1=colors[0] c2=colors[1], mix 0..1, pattern 2/4/8/"noise"; "keep"/"transparent" allowed) | "gradient" (multi-stop ordered-dither gradient, type linear/radial, direction vertical/horizontal/diagonal or x0,y0,x1,y1) | "recipe" (recipe: stone/wood/metal/grass/fabric/brick from a dark→light ramp in colors, tile size; tileable) | "pattern" (repeat the image part across the region) | "tile_group" (per-cell random pick from parts). only: "opaque" | "transparent" | hex → paint only over those pixels. Use make_tileable to fix seams; returns a preview + seamless score.

Parameters (33) · required: path, kind
ParameterTypeDescription
path requiredstringPNG / project to edit (created if missing when width/height given)
outstring
widthinteger
> 0
heightinteger
> 0
frameinteger
≥ 0
layerinteger
≥ 0
kind required"noise" | "noise_circle" | "voronoi" | "dither" | "gradient" | "recipe" | "pattern" | "tile_group"
regionobject
colorsarray of stringHex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels
seedinteger
scalenumber
> 0
cellsinteger
> 0
borderstring
wrapboolean
mixnumber
0–1
patterninteger or string
type"linear" | "radial"
direction"vertical" | "horizontal" | "diagonal"
x0number
y0number
x1number
y1number
cxnumber
cynumber
rnumber
recipestring
tileinteger
> 0
mortarstring
partstringpattern: image path (or "path#x,y,w,h")
partsarray of stringtile_group parts
onlystring
make_tileableboolean
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

texture_scatter

Scatter small parts (built-in tufts: grass, leaf, pebble, flower, twig, crack, sparkle — colored from ramp; or image paths / "path#x,y,w,h" crops) over a region. Picks are seeded by position (stable). on: colors the stamp anchor must land on; clip: only paint over on colors (or opaque pixels); rflip: "x"|"y"|"xy"; rswap: list of {from: to} recolor maps picked at random.

Parameters (17) · required: path, parts
ParameterTypeDescription
path requiredstring
outstring
widthinteger
> 0
heightinteger
> 0
frameinteger
≥ 0
layerinteger
≥ 0
regionobject
parts requiredarray of string
min 1 items
ramparray of stringHex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels
countinteger
> 0
seedinteger
onarray of stringHex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels
clipboolean
rflipboolean or string
rswaparray of map of string
minDistnumber
≥ 0
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

tileset_* · Tilesets (1)

tileset_extract

Split a level/map image into tiles (tileW×tileH, +offset), dedupe identical tiles including flipped X/Y/diagonal copies, write the tileset PNG and the map as Tiled .tmj JSON (gids with flip flags) and optionally CSV. Returns stats + preview of the tileset.

Parameters (13) · required: path, tileW, out
ParameterTypeDescription
path requiredstring
tileW requiredinteger
> 0
tileHinteger
> 0
offsetXinteger
≥ 0
offsetYinteger
≥ 0
flipsboolean
columnsinteger
> 0
out requiredstringtileset PNG path
mapstring.tmj path (default next to out)
csvstring
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

tilemap_* · Tilemaps (1)

tilemap_render

Render a Tiled .tmj map (first tile layer, flips honoured) with its tileset image to a PNG. tileset defaults to the image named in the .tmj (relative to it). Or pass map {width,height,data} + tileW/tileH directly.

Parameters (8) · required: out
ParameterTypeDescription
tmjstring
mapobject
tilesetstring
tileWinteger
> 0
tileHinteger
> 0
out requiredstring
backgroundstring
scaleinteger
1–16

autotile_* · Autotiles (1)

autotile_generate

Generate an autotile set from ONE tile: kind 16 (4-bit mask TOP=1 RIGHT=2 BOTTOM=4 LEFT=8, bit set = same-terrain neighbour; index = mask, 4×4 sheet) or 47 (blob set, 8-neighbour, standard sorted blob order, 8 columns). Passes: bevel highlight/shadow, outline, corner chamfer. palette: "tile" maps results back to the tile's own colors (palette-preserving), or a hex list. Source: tile image (+ region) or a recipe texture. Writes sheet PNG + JSON meta (masks).

Parameters (10) · required: out
ParameterTypeDescription
tilestring
regionobject
recipestring
ramparray of stringHex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels
sizeinteger
4–128
seedinteger
kind16 or 47 or "16" or "47"
palette"tile" or "none" or array of string
out requiredstring
jsonstring

Surfaces, materials and painting

Lighting maps, material previews and the scene painter.

surface_* · Sprite lighting surfaces and material projects (11)

surface_generate

Generate full local material maps with independent depth, alpha-silhouette bevel, specular brightness/threshold/blur and distance/grayscale/horizon occlusion. Optional isolated spritesheet cells and per-frame settings prevent edge bleed.

Parameters (7) · required: path, outDir
ParameterTypeDescription
path requiredstring
min length 1
outDir requiredstring
min length 1
optionsobject
sheetobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

surface_preview

Render sprite lighting locally with up to 16 independently colored diffuse/specular lights, ambient tint, toon quantization and parallax displacement. Does not change generated maps.

Parameters (14) · required: path, out, lights
ParameterTypeDescription
path requiredstring
min length 1
out requiredstring
min length 1
optionsobject
lights requiredarray of object
max 16 items
ambientnumber
0–2
ambientColorarray of any
min 3 items, max 3 items
toonboolean
toonStepsnumber
2–12
parallaxDepthnumber
0–0.5
viewXnumber
0–1
viewYnumber
0–1
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

surface_calibration

Describe source-defined material controls, exact units, defaults and known evidence limits. Does not execute a reference application.

No parameters.

surface_calibrated

Generate source-calibrated normal/specular/occlusion/parallax and utility height PNG maps using native-unit controls, optional custom image bases, 3×3 neighbors and paint overlays. Fully local.

Parameters (9) · required: path, outDir
ParameterTypeDescription
path requiredstring
min length 1
outDir requiredstring
min length 1
prefixstring
max length 80
settingsobject
presetstring
min length 1
inputsobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

surface_preset

Read legacy or Isberg material presets; write .isbpreset documents preserving settings, lights and retained fields.

Parameters (5) · required: action, file
ParameterTypeDescription
action required"read" | "write"
file requiredstring
min length 1
outstring
min length 1
settingsobject
lightsarray of object
max 32 items

surface_project

Create a portable material project, import legacy ZIP or Isberg projects, export .isbmaterial documents, inspect metadata, or update controls and regenerate maps.

Parameters (9) · required: action, file
ParameterTypeDescription
action required"create" | "import" | "export" | "inspect" | "update" | "maps"
file requiredstring
min length 1
outstring
min length 1
imagestring
min length 1
namestring
max length 100
processorinteger
0–127
settingsobject
inputsobject
outDirstring
min length 1

surface_reference_preview

Render independently implemented source-defined Phong/toon/ambient-occlusion and layered parallax rules. CPU is pure local math; GPU executes the actual local shader and reports its backend. No reference executable runs.

Parameters (9) · required: image, out
ParameterTypeDescription
image requiredstring
min length 1
out requiredstring
min length 1
settingsobject
normalstring
min length 1
specularstring
min length 1
occlusionstring
min length 1
parallaxstring
min length 1
previewobject
backend"cpu" | "gpu"

surface_pixels

Decode/encode explicit native row-aligned image byte layouts, inspect descriptors, or resize custom source images using pinned source-defined fast-transform sampling. PNG is decoded/encoded locally.

Parameters (9) · required: operation, file
ParameterTypeDescription
operation required"decode" | "encode" | "resize" | "gray" | "inspect"
file requiredstring
min length 1
outstring
min length 1
format"RGBA8888" | "RGBA8888_Premultiplied" | "ARGB32" | "ARGB32_Premultiplied" | "RGB32" | "RGB888" | "Grayscale8" | "Alpha8" | "Indexed8"
widthinteger
1–16384
heightinteger
1–16384
bytesPerLineinteger
1–10000000
palettearray of array of integer
max 256 items
descriptorstring
min length 1

surface_light_frames

Advance source-defined animated lights by an exact number of 1/60-second ticks; preserves the inspected xyz-radius rule.

Parameters (2) · required: lights, frames
ParameterTypeDescription
lights requiredarray of object
max 32 items
frames requiredinteger
0–10000000

surface_project_state

Edit every preserved project/processor metadata field plus lights, frame grid/animation/position/zoom. Add, duplicate, move or remove processors in the same portable material document.

Parameters (11) · required: file, operation
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
operation required"inspect" | "general" | "processor" | "add" | "duplicate" | "remove" | "move"
processorinteger
0–127
targetinteger
0–127
imagestring
min length 1
namestring
max length 100
metadatamap of any
lightsarray of object
max 32 items
settingsobject
framesobject

surface_preview_session

Persist and replay the source controller’s retained-light uniform state, including its zero-light early-return rule. Rendering remains local source-defined CPU math.

Parameters (7) · required: session, operation
ParameterTypeDescription
session requiredstring
min length 1
operation required"create" | "inspect" | "step" | "render" | "reset"
previewobject
projectstring
min length 1
imagestring
min length 1
outstring
min length 1
settingsobject

material_* · Material maps (2)

material_generate

Generate normal, height, specular, ambient-occlusion and parallax PNG maps locally. Reads images or a project cel; no service or API key.

Parameters (7) · required: path, outDir
ParameterTypeDescription
path requiredstring
min length 1
outDir requiredstring
min length 1
prefixstring
max length 80
optionsobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

material_render

Render local sprite lighting using generated or supplied normal/specular/occlusion maps and up to 16 colored point lights.

Parameters (10) · required: path, out
ParameterTypeDescription
path requiredstring
min length 1
out requiredstring
min length 1
optionsobject
mapsobject
lightsarray of object
max 16 items
ambientnumber
0–2
shininessnumber
1–256
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_* · Scene painter (.isbscene) (13)

scene_painter_open

Create an editable scene painter document from a local scene export. Preserves all nodes, shared resources, materials, skin/morph streams, metadata and an original-scene reset baseline.

Parameters (4) · required: source, out
ParameterTypeDescription
source requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
out requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean

scene_painter_info

Inspect scene targets, resource sharing, masks, animation clips and snapshots. includeScene returns the authoritative source scene.

Parameters (5) · required: path
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
includeSceneboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_targets

Persist selected mesh-node targets. Branch/group IDs with descendants=true include all descendant mesh nodes. Shared resource IDs remain shared.

Parameters (7) · required: path, nodeIds
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIds requiredarray of string
min 1 items, max 10000 items
descendantsboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_selection

Persist per-node vertex masks. Shape selection uses world coordinates, optionally on an evaluated pose. clear selects zero vertices; unmask removes all restrictions. Missing entries in an active mask select zero records.

Parameters (16) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
action required"set" | "add" | "subtract" | "all" | "clear" | "unmask" | "invert" | "grow" | "shrink"
type"indices" | "face" | "sphere" | "box"
indicesarray of integer
max 250000 items
faceinteger
≥ 0
centerarray of any
min 3 items, max 3 items
radiusnumber
> 0
minarray of any
min 3 items, max 3 items
maxarray of any
min 3 items, max 3 items
previewobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_paint

Paint selected scene resources with a world-space color or normal brush. Shared instances receive their strongest influence once. Animated preview supports color painting; deformed normal brushes require base-pose editing.

Parameters (23) · required: path, center, radius
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
center requiredarray of any
min 3 items, max 3 items
radius requirednumber
> 0
opacitynumber
0–1
falloff"smooth" | "linear" | "constant" | "custom"
curvearray of array of any
min 2 items, max 32 items
target"vertex" | "edge" | "face"
channelsarray of any
min 4 items, max 4 items
masksmap of array of integer
frontOnlyboolean
cameraarray of any
min 3 items, max 3 items
ignoreTransparentboolean
alphaThresholdnumber
0–1
previewobject
channel"color" | "normal"
colorstring or array of number
normalarray of any
min 3 items, max 3 items
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_color

Fill, round, replace or seeded-randomize enabled RGBA channels across target resources, respecting saved or supplied per-node masks.

Parameters (14) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
action required"fill" | "round" | "replace" | "randomize"
colorstring or array of number
targetstring or array of number
thresholdnumber
0–2
seedinteger
channelsarray of any
min 4 items, max 4 items
masksmap of array of integer
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_normals

Smooth source normals without reindexing, invert normal vectors, or generate UV tangents across selected scene resources. Updates morph base normals to keep the evaluated preview consistent.

Parameters (9) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
action required"smooth" | "invert" | "tangents"
masksmap of array of integer
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_topology

Split, merge compatible records, create hard/auto normals or invert triangle winding for entire target resources. Remaps skin/morph/UV/custom streams and canonical LOD/shared-shadow indices; refuses opaque indexed metadata. Clears saved vertex masks.

Parameters (10) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
action required"split" | "merge" | "hard" | "auto" | "invert-winding"
anglenumber
0–180
tolerancenumber
> 0
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_snapshot

Capture, apply, import or export multi-resource vertex-color/normal snapshots. Exact correspondence preserves duplicated seam records; fallback matching refuses ambiguity by default. Imports are validated before saving.

Parameters (11) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
action required"capture" | "apply" | "import" | "export"
snapshotFilestring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
masksmap of array of integer
strictboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_reset

Restore selected resources and their skin/morph records from the stored original scene. Preserves current scene transforms and other resources. The reset itself is undoable.

Parameters (7) · required: path
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
outstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_preview

Evaluate local scene animation, constraints, morphs and skins at a time without modifying authored geometry. Optional geometry contains combined world-space positions, normals, colors and source-node ranges.

Parameters (8) · required: path, preview
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
nodeIdsarray of string
min 1 items, max 10000 items
descendantsboolean
preview requiredobject
includeGeometryboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_export

Write the authoritative complete scene or editable painter document to a local JSON file. Scene export retains all resources and authored hierarchy; painter export also retains masks, snapshots and reset baseline.

Parameters (6) · required: path, out
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
out requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
format"scene" | "painter"
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

scene_painter_history

List, undo or redo complete file revisions. Restores exact document bytes, including all resource streams, selections, snapshots and metadata. New edits clear the redo branch.

Parameters (5) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene.
action required"list" | "undo" | "redo"
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

World and levels

Generate worlds and build and playtest levels.

world_* · World builder (3)

world_editor

Activate one of the four bundled world/floor-plan engines.

Parameters (1) · required: editor
ParameterTypeDescription
editor required"town" | "buildings" | "terrain" | "floorplan"

world_editor_state

Read or replace lossless native state of settlements, modular buildings, terrain or floor plans. All operations remain inside the bundled platform.

Parameters (2) · required: editor
ParameterTypeDescription
editor required"town" | "buildings" | "terrain" | "floorplan"
valuemap of any

world_generate

Run the reference world engine with its current settings, optionally updating its complete native state first.

Parameters (2) · required: editor
ParameterTypeDescription
editor required"town" | "buildings" | "terrain" | "floorplan"
valuemap of any

level_* · Level & playtest (10)

level_create

Create an editable blockout from a neutral template or a seeded game style with genre-specific geometry, movement, checkpoints and objectives. Racing and strategy use on-foot inspection, not vehicle or unit AI.

Parameters (8) · required: out
ParameterTypeDescription
out requiredstring
min length 1
template"blank" | "platformer" | "landscape" | "interior"
style"retro-platformer" | "fantasy-rpg" | "dungeon-crawler" | "sci-fi-shooter" | "survival-horror" | "stealth" | "cozy-sim" | "strategy" | "racing" | "puzzle"
seedstring or number
difficulty"relaxed" | "standard" | "challenging"
scalenumber
0.75–2
namestring
settingsobject

level_inspect

Read level metadata, original source warnings, object hierarchy, world transforms and conservative collider bounds.

Parameters (5) · required: path
ParameterTypeDescription
path requiredstring
min length 1
idstring
querystring
type"box" | "sphere" | "cylinder" | "plane" | "marker" | "light" | "camera" | "group" | "unresolved" | "mesh"
limitinteger
1–10000

level_object

Add/update/delete/duplicate a primitive, prop-group, marker, light or camera with typed transforms and neutral pickup components. Rotation is radians; deleting a parent removes descendants.

Parameters (5) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"add" | "update" | "delete" | "duplicate"
idstring
objectobject
offsetarray of any
min 3 items, max 3 items

level_settings

Edit neutral playtest physics, camera mode and optional health/stamina/torch behavior. Change spawn directly or use a marker/object world position.

Parameters (4) · required: path
ParameterTypeDescription
path requiredstring
min length 1
settingsobject
spawnarray of any
min 3 items, max 3 items
spawnObjectstring

level_history

Undo or redo level geometry/settings edits saved by level tools. Gameplay simulation does not add geometry-history entries.

Parameters (2) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"undo" | "redo"

level_import_tscn

Import a local TEXT .tscn hierarchy, transforms, primitive meshes/shapes, lights and cameras. External resource and script descriptors are retained as unresolved data with warnings; no scripts execute or download.

Parameters (3) · required: source, out
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
namestring

level_playtest

Reset, inspect or advance deterministic local playtest movement and attached scripts. AABB collision, steps, gravity, jump, crouch, stamina, optional fall damage/pickups/torch and noclip are simulated without a running UI.

Parameters (7) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"reset" | "state" | "step"
positionarray of any
min 3 items, max 3 items
inputobject
dtnumber
0.000001–0.25
stepsinteger
1–1200
cameraMode"first" | "third" | "topdown"

level_preflight

Check spawn clearance/support, trigger requirements, unresolved objects and authoring budgets; optionally export a JSON handoff report. Static checks do not prove route reachability.

Parameters (4) · required: path
ParameterTypeDescription
path requiredstring
min length 1
outstring
min length 1
objectBudgetinteger
1–10000
colliderBudgetinteger
1–10000

level_export

Write a history-free portable local level with source descriptors/warnings intact. Source .tscn files are not overwritten or converted to executable gameplay.

Parameters (2) · required: path, out
ParameterTypeDescription
path requiredstring
min length 1
out requiredstring
min length 1

level_import_project

Import a local text scene plus supported referenced GDScript/JavaScript and shader source. Resolves res:// inside projectRoot, embeds source into the portable level, and reports missing/unsupported resources. Source runs only when playtest/script tools are invoked.

Parameters (4) · required: source, projectRoot, out
ParameterTypeDescription
source requiredstring
min length 1
projectRoot requiredstring
min length 1
out requiredstring
min length 1
namestring

3D scenes, models and meshes

Scenes, rigs, animation, tile models, vertex painting and format interchange.

scene3d_* · 3D scene & animation (33)

scene3d_modeling_info

Inspect local brush, billboard, mirror, skeleton roots and four-slot skin editing capabilities.

Parameters (3)
ParameterTypeDescription
sourcestring
min length 1
nodestring
vertexinteger
≥ 0

scene3d_brush_place

Paint a snapped atlas tile, six-face block or sticky quad. stickyMode=angle hinges from the edge; camera snaps the edge basis to view vectors and projects the pointer ray. Shift/normalSize restores brush dimensions; proportionate retains aspect. Remove deletes the picked tile/block.

Parameters (4) · required: source, out, options
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
overwriteboolean
options requiredobject

scene3d_modeling_primitive

Add an actual UV mapped wedge or closed segmented cone mesh using the selected embedded material.

Parameters (5) · required: source, out, type
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
overwriteboolean
type required"wedge" | "cone"
optionsmap of any

scene3d_modeling_behavior

Set camera-direction/position billboards, authored local-Y locking, angular snapping, linked animated mirrors and native directional UV-action suffix sectors. Native prefab behavior updates native records.

Parameters (7) · required: source, out, node
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
overwriteboolean
node requiredstring
billboardmap of any
mirrormap of any
directionalobject

scene3d_skeleton_root

Bind a mesh or mesh group to a selected skeleton root and descendant bones, optionally generating automatic weights; preserve matching old weights by default.

Parameters (6) · required: source, out, node, root
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
overwriteboolean
node requiredstring
root requiredstring
automaticboolean

scene3d_bone_display

Edit bone display length/thickness without scaling transforms or changing skin deformation.

Parameters (6) · required: source, out, node
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
overwriteboolean
node requiredstring
lengthnumber
0–10000
thicknessnumber
0.001–1000

scene3d_influence_slots

Set exactly four explicit bone/weight slots on selected vertices. Normalize, merge duplicate influences for deformation, and attach previously unused bones with matching inverse binds.

Parameters (6) · required: source, out, node, vertices, slots
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
overwriteboolean
node requiredstring
vertices requiredarray of integer
min 1 items
slots requiredarray of object
min 4 items, max 4 items

scene3d_import_tile_project

Import Isberg .isbtiles (or .gbtiles) or legacy tile-project JSON into editable geometry, shared instances, native actions/UV sequences, weighted choreography, camera targets/markers, billboards, mirrors and native bones/four-slot skin weights. Unknown source domains remain metadata.

Parameters (5) · required: source, out
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
namestring
overwriteboolean
useExtensionboolean

scene3d_export_tile_project

Export a complete Isberg .isbtiles document retaining editable geometry, hierarchy, animation, cameras, shaders and imported source metadata.

Parameters (11) · required: source, out
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
timenumber
≥ 0
clipIdstring
actIdstring
originalboolean
mode"editable" | "baked" | "original"
isolateRigsboolean
allowLossyCoreboolean
includeExtensionboolean
overwriteboolean

scene3d_native_info

Inspect native actors, editable exact scalar actions, UV frames, weighted acts and supported native behavior domains.

Parameters (2) · required: source
ParameterTypeDescription
source requiredstring
min length 1
includeRecordsboolean

scene3d_native_evaluate

Evaluate exact native eased action/choreography, signed timescale/weights, animated UV corner data, camera targets/switches and billboards at a local timeline time.

Parameters (9) · required: source, time
ParameterTypeDescription
source requiredstring
min length 1
time requirednumber
≥ 0
clipIdstring
actIdstring
cameraPositionarray of number
min 3 items, max 3 items
cameraDirectionarray of number
min 3 items, max 3 items
includeMeshesboolean
outstring
min length 1
overwriteboolean

scene3d_native_channels

Define named declarative easing curves and bind arbitrary numeric native properties to node UV/visibility, material, light, camera or custom targets. No source script is evaluated.

Parameters (5) · required: source, out
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
easingsmap of any
bindingsmap of any
overwriteboolean

scene3d_native_edit

Edit native action curves, UV frame sequences, choreography segments/weights/markers or prefab billboard/mirror behavior as validated structured data, retaining all other scene edits.

Parameters (6) · required: source, out, kind, id, value
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
kind required"action" | "uv" | "act" | "behavior"
id requiredstring
value requiredmap of any
overwriteboolean

scene3d_constraint

Inspect/add/update/remove local IK, look-at, copy-transform, weighted-parent, distance or rotation-limit constraints. Solvers execute in normal scene evaluation.

Parameters (5) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"inspect" | "set" | "remove"
constraintobject
idstring

scene3d_retarget

Transfer a source animation to a target rest pose using explicit bone-name/ID mapping, hierarchy-aware world rotation and optional scaled root motion. Produces editable sampled tracks.

Parameters (9) · required: source, target, out, clipId, mapping
ParameterTypeDescription
source requiredstring
min length 1
target requiredstring
min length 1
out requiredstring
min length 1
clipId requiredstring
mapping requiredmap of string
namestring
fpsinteger
1–120
rootMotionboolean
translationScalenumber
> 0

scene3d_rig_bake

Bake evaluated IK/constraints into an editable animation clip for interchange, with bounded sampling. The baked clip bypasses live constraints during playback.

Parameters (5) · required: file, clipId
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
clipId requiredstring
namestring
fpsinteger
1–120

scene3d_morph_weights

Inspect or edit morph weights used by the main scene renderer before skeletal deformation. Targets and weight animation remain editable in scene metadata.

Parameters (4) · required: file, node
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
node requiredstring
weightsarray of number
max 256 items

scene3d_create

Create an independent local 3D scene with geometry, hierarchy, skeletons, animation clips, lights and cameras.

Parameters (4) · required: out
ParameterTypeDescription
out requiredstring
min length 1
namestring
scenemap of any
primitive"cube" | "plane" | "sphere" | "cylinder"

scene3d_info

Inspect a local advanced scene: objects, shared meshes, bones, skinning, animation clips, choreography and component selection.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1

scene3d_open

Open a local advanced scene in the running unified desktop through its authenticated loopback bridge.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1

scene3d_render

Render the running local 3D viewport animation into PNG frames ZIP or silent WebM. Uses the bundled renderer/encoder and a controlled local export transaction.

Parameters (6) · required: out, format
ParameterTypeDescription
out requiredstring
min length 1
format required"frames" | "webm"
filestring
min length 1
clipstring
actstring
overwriteboolean

scene3d_render_status

Inspect or finish a pending local 3D animation export job returned by scene3d_render.

Parameters (2) · required: id
ParameterTypeDescription
id requiredstring
finishboolean

scene3d_object

Create/edit/delete/parent/instance scene objects, primitives or texture tiles. Object rotations are normalized quaternions; geometry units are meters.

Parameters (8) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"primitive" | "tile" | "add" | "edit" | "remove" | "parent" | "instance"
idstring
type"cube" | "plane" | "sphere" | "cylinder" | "mesh" | "group" | "bone" | "camera" | "light"
optionsmap of any
parentstring or null
preserveWorldboolean

scene3d_select

Select mesh vertices, edges or triangle faces. Replace/add/subtract/intersect/all/invert selections; component IDs are zero-based.

Parameters (6) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
nodestring
mode"vertices" | "edges" | "faces"
operation"replace" | "add" | "subtract" | "intersect" | "all" | "invert"
indicesarray of integer
max 250000 items

scene3d_geometry

Edit indexed geometry: split faces, subdivide, extrude, delete faces, transform selected points, paint RGBA vertex colors or transform UVs. Skin weights follow topology changes.

Parameters (5) · required: file, operation
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
nodestring
operation required"split" | "subdivide" | "extrude" | "delete" | "transform" | "paint" | "uv"
optionsmap of any

scene3d_material

Add/edit an embedded local material, assign it to a mesh, and control environment/camera settings. Texture file imports are converted to embedded PNG.

Parameters (7) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"add" | "edit" | "assign" | "environment" | "activeCamera"
idstring
nodestring
optionsmap of any
texturestring
min length 1

scene3d_skin

Bind/unbind meshes to bone hierarchies, assign normalized four-influence weights, paint weights with spatial falloff or restore the bind pose.

Parameters (8) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"bind" | "unbind" | "weights" | "paint" | "rest"
nodestring
jointsarray of string
max 256 items
verticesarray of integer
max 250000 items
influencesarray of object
max 256 items
optionsmap of any

scene3d_animation

Edit clips, keyframe tracks, interpolation, markers and weighted choreography items. Animation quaternion values use XYZW and time is seconds.

Parameters (6) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"clip" | "clipEdit" | "key" | "removeKey" | "marker" | "act" | "actItem"
clipstring
actstring
optionsmap of any

scene3d_evaluate

Evaluate scene hierarchy, quaternion/Hermite animation, choreography, skin deformation and markers locally. Optionally save a sampled animation to JSON.

Parameters (9) · required: file
ParameterTypeDescription
file requiredstring
min length 1
clipstring
actstring
timenumber
≥ 0
fromnumber
≥ 0
framesinteger
1–1000
fpsnumber
1–240
includeGeometryboolean
outstring
min length 1

scene3d_prefab

Save an object subtree as a reusable portable scene or instantiate a local prefab with remapped mesh/material/bone/animation references.

Parameters (6) · required: file, action, prefab
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"save" | "instantiate"
nodestring
prefab requiredstring
min length 1
optionsmap of any

scene3d_export

Export advanced scenes as embedded glTF/GLB including skins+clips+lights, flattened OBJ+MTL, skeletal Collada, floor-tile TMX or portable scene JSON. Sidecar textures are local.

Parameters (4) · required: file, out, format
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
format required"json" | "gltf" | "glb" | "obj" | "dae" | "tmx"
optionsmap of any

scene3d_import

Import local OBJ(+MTL), glTF/GLB, finite CSV TMX, Isberg .isbtiles or portable scene JSON. Declared resource paths stay inside the import directory; remote and compressed geometry is rejected.

Parameters (4) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
format"json" | "isbtiles" | "gbtiles" | "gltf" | "glb" | "obj" | "tmx"
resourcesmap of string

scene3d_timeline_edit

Create and edit exact action curves, multi-key selections, ordered UV frame sequences, object assignments, weighted choreography and camera switches. Uses the same engine as tile-modeler controls and preserves the editable scene in local Isberg formats.

Parameters (19) · required: source, domain, operation
ParameterTypeDescription
source requiredstring
min length 1
outstring
min length 1
domain required"action" | "uv" | "act"
operation required"create" | "rename" | "keys" | "removeKeys" | "shiftKeys" | "update" | "insert" | "delete" | "move" | "duplicate" | "assign" | "segment" | "marker" | "removeSegment" | "removeMarker" | "weightKeys" | "removeWeightKeys" | "shiftWeightKeys"
idstring
nodestring
namestring
propertystring
componentstring
keysarray of object
max 100000 items
timesarray of number
max 100000 items
deltanumber
-1000000000000–1000000000000
indexinteger
≥ 0
tointeger
≥ 0
tilesetinteger
≥ 0
frameobject
segmentobject
weightsarray of object
max 100000 items
markerobject

model_* · Tile models (.isbtiles) (3)

model_create

Create a local tile-based 3D scene with an optional embedded texture atlas. Distances are grid units and rotations are radians.

Parameters (5) · required: out
ParameterTypeDescription
out requiredstring
min length 1
scenemap of any
atlasFilestring
min length 1
tileWidthinteger
≥ 1
tileHeightinteger
≥ 1

model_edit

Edit local tile geometry, individual corners and UVs, diagonals, subdivision/cuts, extrusion, clipboard, selection transforms, snap/weld and multiple atlases. Native source context is retained. patch supplies operation options; angles are radians.

Parameters (8) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"add" | "remove" | "transform" | "duplicate" | "settings" | "vertices" | "uv" | "diagonal" | "subdivide" | "cut" | "extrude" | "selectionTransform" | "snap" | "weld" | "copy" | "paste" | "atlasAdd" | "atlasSelect" | "atlasRemove"
idstring
idsarray of string
tilemap of any
patchmap of any
offsetarray of any
min 3 items, max 3 items

model_export

Export the complete local model document and retained scene context. Supports multiple atlases, rigs, animation and native tile projects through the same integrated exporters. Static formats report animation limitations; sidecars are saved beside the requested output.

Parameters (4) · required: file, out, format
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
format required"obj" | "gltf" | "glb" | "dae" | "fbx" | "ply" | "stl" | "tmx" | "isbtiles" | "gbtiles"
optionsmap of any

mesh_* · Vertex painter meshes (13)

mesh_create

Create an editable local mesh project from a demo, inline OBJ text, or a local OBJ/JSON file. All images, services and geometry remain local.

Parameters (4) · required: out
ParameterTypeDescription
out requiredstring
min length 1
sourcestring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
objstring
max length 67108864
namestring
max length 200

mesh_info

Inspect a local mesh: topology counts, bounds, UV presence, and saved vertex selection. Optionally include the complete indexed mesh data.

Parameters (2) · required: path
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
includeMeshboolean

mesh_paint

Paint per-vertex RGB/RGBA using a spherical local brush, distance falloff, opacity and an optional selection mask. Writes independent geometry/colors to out, or edits the source file in place.

Parameters (16) · required: path, color
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
centerarray of any
min 3 items, max 3 items
Brush center in mesh/world coordinates; default [0,0,0].
radiusnumber
> 0
Brush radius in mesh units; default 1.
opacitynumber
0–1
Blend weight 0–1; default 1.
falloff"smooth" | "linear" | "constant"
selectionarray of integer
max 250000 items
Restrict to vertex indices. Omit to use the saved mask (or all vertices when it is empty).
target"vertex" | "edge" | "face"
sharedMode"merge" | "split"
channelsarray of any
min 4 items, max 4 items
frontOnlyboolean
cameraarray of any
min 3 items, max 3 items
World-space camera position for ray-occlusion filtering.
ignoreTransparentboolean
alphaThresholdnumber
0–1
curvearray of array of any
min 2 items, max 32 items
color requiredstring or array of numberRGB/RGBA hex or 3–4 normalized components.

mesh_normals

Smooth/normalize area-weighted vertex normals, invert normals and triangle winding, or paint normalized normal vectors with a spherical brush and saved selection mask.

Parameters (18) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
action required"smooth" | "hard" | "auto" | "invert" | "paint" | "tangents"
normalarray of any
min 3 items, max 3 items
anglenumber
0–180
centerarray of any
min 3 items, max 3 items
Brush center in mesh/world coordinates; default [0,0,0].
radiusnumber
> 0
Brush radius in mesh units; default 1.
opacitynumber
0–1
Blend weight 0–1; default 1.
falloff"smooth" | "linear" | "constant"
selectionarray of integer
max 250000 items
Restrict to vertex indices. Omit to use the saved mask (or all vertices when it is empty).
target"vertex" | "edge" | "face"
sharedMode"merge" | "split"
channelsarray of any
min 4 items, max 4 items
frontOnlyboolean
cameraarray of any
min 3 items, max 3 items
World-space camera position for ray-occlusion filtering.
ignoreTransparentboolean
alphaThresholdnumber
0–1
curvearray of array of any
min 2 items, max 32 items

mesh_selection

Create or modify a persistent vertex mask. Select explicit indices, a triangle, a world-space XYZ box, a world-space sphere, or an XY circle; invert, grow or shrink through triangle adjacency. Saved masks restrict subsequent paint calls.

Parameters (12) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
action required"set" | "add" | "subtract" | "all" | "clear" | "invert" | "grow" | "shrink"
type"indices" | "face" | "box" | "sphere" | "circle" | "lasso"
indicesarray of integer
max 250000 items
faceinteger
≥ 0
centerarray of any
min 3 items, max 3 items
radiusnumber
> 0
minarray of any
min 3 items, max 3 items
maxarray of any
min 3 items, max 3 items
polygonarray of array of any
min 3 items, max 2048 items
pointsarray of array of any
max 250000 items
Lasso projected XY points, one per vertex. Omit to use world XY positions.

mesh_topology

Split vertices so each triangle corner can be edited independently, or merge vertices at quantized coincident positions. Merge averages RGBA colors, recomputes smooth normals and keeps the first UV at each shared position. Clears selection after reindexing.

Parameters (4) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
action required"split" | "merge"
tolerancenumber
> 0
Merge position quantization in mesh units; default 0.00001.

mesh_export

Export the current local mesh as colored OBJ (v XYZ RGBA, UV and normals) or a portable editable JSON project. OBJ cannot retain selection masks or editor snapshots.

Parameters (2) · required: path, out
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
out requiredstring
min length 1

mesh_color_action

Fill, round at 0.5 (ties up), replace by Euclidean channel distance, or seeded-randomize enabled RGBA channels. Respects the saved or explicit vertex mask.

Parameters (9) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
action required"fill" | "round" | "replace" | "randomize"
colorstring
targetstring
thresholdnumber
0–2
channelsarray of any
min 4 items, max 4 items
selectionarray of integer
max 250000 items
seedinteger

mesh_snapshot

Capture, save, load or apply portable vertex colors/normals by position tolerance (default 0.0005 units), disambiguated by normal then UV. Strict transfers refuse ambiguous/unmatched records.

Parameters (8) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
action required"capture" | "apply" | "export" | "import"
snapshotFilestring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
selectionarray of integer
max 250000 items
tolerancenumber
> 0
normalsboolean
strictboolean

mesh_selection_set

Persist named vertex masks inside the portable mesh project, load a set, list sets or remove a set.

Parameters (5) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
action required"save" | "load" | "list" | "remove"
namestring
max length 200
indicesarray of integer
max 250000 items

mesh_swatches

Read or update a project-local RGBA swatch collection. Import unique 8-bit colors from the current mesh, or provide hex chips. Save/load the project to preserve swatches.

Parameters (6) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
action required"list" | "set" | "from_mesh" | "from_image" | "import" | "export" | "reset"
colorsarray of string
max 256 items
imagestring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
collectionFilestring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.

mesh_reimport

Safely transfer painted colors/normals onto a refreshed local OBJ/JSON mesh. Uses exact correspondence first, then position/normal/UV matching; ambiguous or unmatched transfer is refused unless strict is false. Reset replaces the mesh with its saved original.

Parameters (6) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
outstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
action required"reimport" | "reset" | "set_source"
sourcestring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
tolerancenumber
> 0
strictboolean

mesh_history

List saved mesh revisions, undo an edit or redo an undone edit. Writing tools record up to 50 original byte snapshots locally and clear the redo branch.

Parameters (2) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
Local mesh JSON/project or OBJ path, absolute or relative to the workspace.
action required"list" | "undo" | "redo"

interchange_* · Formats & interchange (9)

interchange_capabilities

Inspect the exact local format import/export domains, diagnostics and known unsupported features. No AI models or external services are used.

No parameters.

interchange_import

Import local Collada, ASCII/binary FBX, multi-atlas TMX, PLY/STL, morph/Draco glTF, OBJ or native tile JSON into an editable portable scene. Bundled WASM decoders run in-process.

Parameters (8) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
format"json" | "obj" | "gltf" | "glb" | "dae" | "fbx" | "tmx" | "ply" | "stl" | "isbtiles" | "gbtiles" | "croco" | "crocotile" | "c3dp"
resourcesmap of string
overwriteboolean
preserveRawboolean
useSceneExtensionboolean
extensionPolicy"preserve" | "error"

interchange_info

Inspect an imported scene, or a model source file imported in memory, and its retained source-format metadata. Raw metadata is included only when explicitly requested.

Parameters (2) · required: file
ParameterTypeDescription
file requiredstring
min length 1
includeMetadataboolean

interchange_export

Export a local scene into glTF/GLB with morphs, Collada, multi-atlas TMX, PLY/STL, OBJ+MTL, JSON, ASCII FBX with skins/TRS animation, or editable Isberg .isbtiles documents. Writes all local sidecars together.

Parameters (6) · required: file, outDir, format
ParameterTypeDescription
file requiredstring
min length 1
outDir requiredstring
min length 1
namestring
format required"json" | "obj" | "gltf" | "glb" | "dae" | "fbx" | "tmx" | "ply" | "stl" | "isbtiles" | "gbtiles"
optionsobject
overwriteboolean

interchange_export_live

Export the running unified 3D editor state directly to a supported local format, including embedded morph metadata.

Parameters (5) · required: outDir, format
ParameterTypeDescription
outDir requiredstring
min length 1
namestring
format required"json" | "obj" | "gltf" | "glb" | "dae" | "fbx" | "tmx" | "ply" | "stl" | "isbtiles" | "gbtiles"
optionsobject
overwriteboolean

interchange_morph

Sample morph-weight animation, apply explicit weights, and optionally save a baked editable pose while preserving base targets and source metadata.

Parameters (7) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
clipstring
timenumber
≥ 0
loopboolean
weightsmap of array of number
overwriteboolean

interchange_point_cloud

Read, create, replace or remove an editable local point-cloud primitive on a scene node. glTF POINTS, Draco points and PLY point arrays remain actual points.

Parameters (6) · required: file, node
ParameterTypeDescription
file requiredstring
min length 1
node requiredstring
indexinteger
≥ 0
outstring
min length 1
valuemap of any or null
overwriteboolean

interchange_open

Send an imported portable scene into the running unified 3D editor through the authenticated local bridge.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1

interchange_fbx_metadata

Parse ASCII/binary FBX records and compressed arrays in-process and inspect original object/connection metadata without executing source code.

Parameters (2) · required: file
ParameterTypeDescription
file requiredstring
min length 1
includeRecordsboolean

Audio and music

Compose music, process and render audio, and design sounds.

music_* · Music & composition (10)

music_project

Create, inspect, or update a genre-neutral local composition. Audio samples are embedded PCM; no remote instruments. Presets: arcade, bright, comedy, interface, ambient, orchestral, electronic, suspense

Parameters (13) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"create" | "inspect" | "update"
preset"arcade" | "bright" | "comedy" | "interface" | "ambient" | "orchestral" | "electronic" | "suspense"
namestring
temponumber
20–400
beatsnumber
0.25–10000000
sampleRatenumber
8000–96000
masternumber
0–2
normalizeboolean
tailSecondsnumber
0–10
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_track

Add, update, delete or list synthesizer, polyphonic sampler and audio-clip tracks. Independent pitch/timeStretch, trim, reverse, ADSR, mute and solo are local.

Parameters (7) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"add" | "update" | "delete" | "list"
trackIdstring
settingsobject
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_notes

Add/replace notes or update/delete one indexed piano-roll note. Times are beats; simultaneous notes produce polyphony.

Parameters (8) · required: path, trackId, op
ParameterTypeDescription
path requiredstring
min length 1
trackId requiredstring
op required"add" | "replace" | "update" | "delete" | "list"
notesarray of object
max 8192 items
indexinteger
0–8191
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_sample

Import PCM WAV into a project as an embedded sampler/clip, impulse response or vocoder modulation source; list/delete assets.

Parameters (7) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"import" | "delete" | "list"
sampleIdstring
sourcestring
min length 1
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_automation

Set, clear or inspect gain, pan, filter cutoff or pitch automation curves. Point time is beats; linear, step and positive exponential segments are supported.

Parameters (8) · required: path, trackId, parameter, op
ParameterTypeDescription
path requiredstring
min length 1
trackId requiredstring
parameter required"gain" | "pan" | "cutoff" | "pitch"
op required"set" | "clear" | "inspect"
pointsarray of object
max 4096 items
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_effect

Add/update/remove/list track filter, delay, FFT spectral/formant/freeze, convolution IR or multiband vocoder effects. sampleId references an embedded local WAV.

Parameters (8) · required: path, trackId, op
ParameterTypeDescription
path requiredstring
min length 1
trackId requiredstring
op required"add" | "update" | "delete" | "list"
effectobject
indexinteger
0–15
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_midi

Import/export SMF 0/1/2 with PPQ or SMPTE timing. Retains tempo maps, channel controls/programs/bend/pressure, note release data, SysEx, all metadata and original bytes. Untouched imports export byte-exactly; edits preserve opaque events. Native local timbres do not emulate arbitrary external sound banks.

Parameters (8) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"import" | "export" | "sequence" | "inspect"
midistring
min length 1
sequenceinteger
0–127
preserveOriginalboolean
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_timing

Inspect or replace the full tempo map and time signature map. Tempo drives notes, sampler gates, clips, automation and render length; BPM is converted to exact MIDI microseconds/quarter.

Parameters (7) · required: path, op
ParameterTypeDescription
path requiredstring
min length 1
op required"inspect" | "set"
tempoMaparray of object
max 100000 items
timeSignaturesarray of object
max 100000 items
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_events

List, append, replace or delete native channel performance events: every CC number, bank select, program, pitch bend and pressure. Rendering interprets pedals, all sound/notes off, volume/expression/pan/modulation and RPN pitch sensitivity/tuning; all controls export losslessly.

Parameters (8) · required: path, trackId, op
ParameterTypeDescription
path requiredstring
min length 1
trackId requiredstring
op required"list" | "append" | "replace" | "delete"
eventsarray of object
max 200000 items
indexinteger
0–199999
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

music_render

Render composition tracks and effect chains in a dedicated local worker to mono/stereo 16/24-bit WAV and optional stems. For polling/progress/cancellation use audio_render_job.

Parameters (10) · required: path, out
ParameterTypeDescription
path requiredstring
min length 1
out requiredstring
min length 1
bits"16" | "24"
monoboolean
normalizeboolean
sampleRatenumber
8000–96000
stemsDirstring
min length 1
layerinteger
≥ 0
For .isbsprite projects: layer index of the cel to read/edit (project_info lists layers). Single-layer projects default to 0; without it, reads use the frame composite.
frameinteger
≥ 0
For .isbsprite projects: frame index (default 0).
selectanyLimit the edit to a selection; pixels outside stay untouched. { shapes: [ {type:"rect"|"ellipse",x,y,w,h} | {type:"polygon",points:[[x,y],...]} | {type:"wand",x,y,tolerance?,contiguous?} | {type:"color",color,tolerance?} | {type:"opaque"} — later shapes take mode:"add"|"subtract"|"intersect" ], invert?, expand?, contract?, border? }. Preview it with pixel_select.

audio_* · Audio processing and rendering (4)

audio_process_pcm

Process mono/stereo WAV in a dedicated local worker: independent stretch/pitch, spectral/formant/freeze, mono/stereo IR convolution, vocoder, anti-aliasing sinc resampling or reverse. Both channels stay independent. No external executable.

Parameters (11) · required: source, out, operation
ParameterTypeDescription
source requiredstring
min length 1
out requiredstring
min length 1
operation required"time_stretch" | "pitch_shift" | "spectral" | "convolution" | "vocoder" | "resample" | "reverse"
rationumber
0.25–4
semitonesnumber
-24–24
sampleRatenumber
8000–96000
secondarystring
min length 1
spectralobject
vocoderobject
normalizeIRboolean
bits"16" | "24"

audio_render_job

Start/poll/cancel local music rendering or PCM processing. Cancellation terminates the dedicated worker even during FFT computation. A completed job reports actual saved output metadata; start returns immediately.

Parameters (5) · required: op
ParameterTypeDescription
op required"start" | "status" | "cancel" | "list"
idstring
kind"music" | "pcm"
musicobject
pcmobject

audio_catalog

Search bundled local procedural audio presets, ambience scenes and recording transformations. Optionally return complete scene settings.

Parameters (4)
ParameterTypeDescription
querystring
mode"sfx" | "ambient" | "import"
includeSceneboolean
limitinteger
1–200

audio_render

Render a bundled audio preset or custom layered scene to local WAV. Optional local WAV sources support trim, reverse, pitch, speed, timing and layered processing.

Parameters (10) · required: out
ParameterTypeDescription
out requiredstring
min length 1
presetIdstring
scenemap of any
durationnumber
0.1–180
sampleRateinteger
8000–96000
bits"16" | "24"
monoboolean
normalizeboolean
loopSecondsnumber
0–4
sourcesarray of object
max 12 items

parameter_* · Parameter sound (.isbsound) (7)

parameter_sound_session

Persist/replay actual source-style DSP state: separate physical routing, live processed-frame cursor, previous wah-strength block and lazy delay-duration curve. Pure local workers support cancellable render jobs. Cached renders process complete2048-frame blocks and save their exact continuation state.

Parameters (8) · required: operation
ParameterTypeDescription
operation required"create" | "inspect" | "restore" | "route" | "playback" | "render" | "start" | "status" | "cancel" | "list"
sessionstring
min length 1
soundstring
min length 1
outstring
min length 1
stateobject
orderarray of "tremolo" | "ring" | "wah" | "digital" | "delay"
min 5 items, max 5 items
processedFramesinteger
0–2646000
idstring

parameter_sound_project

Create, inspect, replace or patch an editable local sound. Ten wave shapes, normalized pitch/ADSR/modulator controls, harmonic/FM/arp, ordered effects, EQ/compression and native compact setup data. Presets are local editable sketches.

Parameters (5) · required: file, op
ParameterTypeDescription
file requiredstring
min length 1
op required"create" | "inspect" | "update"
preset"coin" | "zap" | "boom" | "jump" | "powerup" | "fall" | "impact" | "blip" | "random"
seedinteger
0–999999999
patchobject

parameter_sound_control

Inspect or patch every authored sound control with typed nested fields. Envelope times are normalized 0–1 (5 seconds per unit); frequency/motion and modulation use documented mathematical response curves. Effect order is editable.

Parameters (3) · required: file, op
ParameterTypeDescription
file requiredstring
min length 1
op required"inspect" | "set"
patchobject

parameter_sound_setup

Import legacy .cpt settings or Isberg .isbsound documents; export versioned Isberg sound documents and GBS1 setup codes. Complete editable controls, names and session metadata are retained.

Parameters (5) · required: file, op
ParameterTypeDescription
file requiredstring
min length 1
op required"import" | "export" | "decode_code" | "encode_code"
setupstring
min length 1
codestring
min length 10, max length 100000
outstring
min length 1

parameter_sound_render

Synthesize editable parameters in a dedicated local worker and export native PCM WAV (16-bit 32000 scale or 8-bit output; 44100/22050 Hz). Returns actual render dimensions. No waveform playback substitution or external synthesizer.

Parameters (2) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1

parameter_sound_job

Start/poll/cancel worker synthesis. Cancellation terminates all remaining oscillation/effect processing. Completed jobs report actual saved WAV metadata.

Parameters (4) · required: op
ParameterTypeDescription
op required"start" | "status" | "cancel" | "list"
idstring
filestring
min length 1
outstring
min length 1

parameter_sound_variation

Apply source-defined eight-generator, full randomize, mutation or reset transitions. Saves an explicit local random continuation state; supplied recorded draws support reproducible reference replay. Native preset operations preserve effects/master/noise seed; mutation changes selected continuous controls.

Parameters (9) · required: file, operation
ParameterTypeDescription
file requiredstring
min length 1
operation required"inspect" | "preset" | "randomize" | "mutate" | "reset"
design"coin" | "zap" | "boom" | "jump" | "powerup" | "fall" | "impact" | "blip"
seedinteger
0–4294967295
noiseSeedinteger
0–999999999
randomStateobject
randomValuesarray of number
max 100000 items
amountnumber
0–1
quantizeboolean

sfx_* · Sound designer (2)

sfx_presets

List deterministic local retro sound-effect presets.

No parameters.

sfx_generate

Synthesize a retro sound effect locally into PCM WAV. Supply a preset and/or oscillator, envelope, filter, pitch, arpeggio and delay options.

Parameters (4) · required: out
ParameterTypeDescription
out requiredstring
min length 1
preset"pickup" | "laser" | "explosion" | "powerup" | "hit" | "jump" | "blip" | "random"
seedinteger
optionsmap of any

media_* · Audio encoding (1)

media_encode_audio

Encode a local PCM WAV to MP3, Ogg Vorbis or FLAC using only the bundled codec; no PATH lookup, service or separate install.

Parameters (4) · required: file, out, format
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
format required"mp3" | "ogg" | "flac" | "wav"
qualitynumber
0–9

Avatars

Layered avatar rigs with speaking, blink and motion.

avatar_* · Avatar stage (.isbavatar) (17)

avatar_import_native

Import an indexed JSON sprite-avatar .save with embedded PNG data, native motion/visibility/costume fields and hierarchy. Path-only records require explicit local image mappings. Selects frame-tick compatibility mode.

Parameters (7) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
namestring
widthinteger
16–4096
heightinteger
16–4096
fpsnumber
1–240
imagesarray of object
max 256 items

avatar_export_native

Export a complete Isberg .isbavatar rig with embedded sprites, expressions, transforms and imported metadata.

Parameters (2) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1

avatar_settings

Configure a local avatar timing, microphone gate/device, blink, output window or bounce settings using typed fields. This does not start microphone capture.

Parameters (9) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
thresholdnumber
0.001–1
timingobject
microphoneobject
outputobject
physicsobject
blinkobject
backgroundstring

avatar_layer_transform

Set typed local sprite transforms, pivots, image offsets, flips, opacity and Z order.

Parameters (16) · required: file, layerId
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
layerId requiredstring
min length 1
xnumber
-32768–32768
ynumber
-32768–32768
rotationnumber
-36000–36000
scaleXnumber
0.01–100
scaleYnumber
0.01–100
pivotXnumber
0–1
pivotYnumber
0–1
offsetXnumber
-32768–32768
offsetYnumber
-32768–32768
flipXboolean
flipYboolean
opacitynumber
0–1
zIndexinteger
-4096–4096

avatar_layer_motion

Set deterministic sine/spring motion or compatibility tick frequency, drag, rotation limits, stretch and animation speed.

Parameters (25) · required: file, layerId
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
layerId requiredstring
min length 1
amplitudeXnumber
-1000–1000
amplitudeYnumber
-1000–1000
speedXnumber
0–20
speedYnumber
0–20
speednumber
0–20
phasenumber
phaseXnumber
phaseYnumber
rotationAmplitudenumber
-180–180
springboolean
stiffnessnumber
1–1000
dampingnumber
0–100
dragnumber
0–1
bouncenumber
0–500
nativeFrequencyXnumber
nativeFrequencyYnumber
nativeDragnumber
0–100
nativeAnimationSpeednumber
0–10000
rotationDragnumber
-100–100
rotationMinnumber
-360–360
rotationMaxnumber
-360–360
stretchnumber
-100–100

avatar_layer_visibility

Configure a sprite speaking/blink condition, independent native state gates, ten costume memberships, alpha clipping, hotkey and bounce policy.

Parameters (11) · required: file, layerId
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
layerId requiredstring
min length 1
visibleboolean
condition"always" | "speaking" | "silent" | "blinking" | "eyes-open" | "speaking-blink" | "silent-blink"
talkStateinteger
0–2
blinkStateinteger
0–2
costumesarray of boolean
min 10 items, max 10 items
hotkeystring
max length 24
clipChildrenboolean
ignoreBounceboolean

avatar_layer_operation

Duplicate, reparent, reorder, replace an embedded PNG or remove a layer. Reparent/removal can preserve current world positions; children are safely unlinked when removing their parent.

Parameters (8) · required: file, layerId, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
layerId requiredstring
min length 1
action required"duplicate" | "reparent" | "reorder" | "replace_png" | "remove"
parentIdstring or null
indexinteger
0–255
imagestring
min length 1
preserveWorldboolean

avatar_expression

Capture, edit, remove or activate a named expression of typed per-layer visibility/transforms, or select one of ten costume masks.

Parameters (8) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
action required"capture" | "set" | "remove" | "activate" | "costume" | "list"
expressionIdstring
namestring
keystring
max length 24
costumeinteger
1–10
layersarray of object
max 256 items

avatar_hotkeys

Set or inspect local avatar keyboard bindings for costume, expression, layer toggle, test speaking or blink. These bindings require the avatar UI/output window to receive the key.

Parameters (3) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
bindingsarray of object
max 128 items

avatar_frame

Evaluate a deterministic avatar frame, including native frame-tick compatibility, costume/expression gates, alpha clipping ancestry, crop rectangles, Z sorting and world transforms. No microphone/device is opened.

Parameters (7) · required: file
ParameterTypeDescription
file requiredstring
min length 1
timenumber
≥ 0
frameinteger
0–100000
volumenumber
0–1
blinkboolean
costumeinteger
1–10
expressionstring

avatar_history

Inspect, undo or redo local byte revisions recorded by typed avatar authoring tools. Keeps up to 50 pre-edit revisions; new edits clear redo.

Parameters (2) · required: file, action
ParameterTypeDescription
file requiredstring
min length 1
action required"list" | "undo" | "redo"

avatar_render_png

Render a local avatar to PNG headlessly at a specified timestamp/tick, including embedded spritesheets, world transforms, transparency, layered alpha clipping and costume/expressions.

Parameters (8) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1
out requiredstring
min length 1
timenumber
≥ 0
frameinteger
0–100000
volumenumber
0–1
blinkboolean
costumeinteger
1–10
expressionstring

avatar_signal

Local source-defined avatar signal calibration and state replay: native PCG32 uint64 state/float draws, twelve-tick blink transitions, stereo FFT magnitude and sensitivity decay. Optional configuration saves the authored rig; WAV inspection does not open a microphone or certify hardware latency.

Parameters (26) · required: operation
ParameterTypeDescription
operation required"configure" | "rng" | "blink" | "spectrum" | "sensitivity"
filestring
min length 1
outstring
min length 1
seedstring
randomStateobject
countinteger
1–100000
floatRangeboolean
blinkStateobject
speednumber
0.01–10
chanceinteger
1–1000000
microphoneobject
randomAlgorithm"legacy-lcg32" | "pcg32"
wavstring
min length 1
fftSize256 or 512 or 1024 or 2048 or 4096
fromnumber
0–192000
tonumber
0–192000
mode"max" | "average"
startFrameinteger
≥ 0
includeBinsboolean
volumenumber
0–20
volumeLimitnumber
0–2
senseLimitnumber
0–1
deltanumber
0–1
sensitivitynumber
-10–1
speakingboolean
microphoneActiveboolean

avatar_create

Create a portable local avatar rig. Optional local PNG sprite layers are embedded in the saved JSON.

Parameters (6) · required: out
ParameterTypeDescription
out requiredstring
min length 1
namestring
widthinteger
16–4096
heightinteger
16–4096
backgroundstring
layersarray of map of any
max 256 items

avatar_validate

Validate a saved local avatar rig and report hierarchy and sprite-sheet metadata.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1

avatar_edit

Edit a portable avatar rig with a validated top-level patch and/or layer add, update or remove operation.

Parameters (6) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
patchmap of any
action"add" | "update" | "remove"
layerIdstring
layermap of any

avatar_evaluate

Evaluate local avatar speaking/blinking, sprite-sheet frames, hierarchical transforms and spring motion at specified times.

Parameters (6) · required: file
ParameterTypeDescription
file requiredstring
min length 1
timenumber
≥ 0
dtnumber
0–0.1
volumenumber
0–1
blinkboolean
stepsinteger
1–600

RPG Creator

RPG projects, characters, diagnostics, playtest and export.

rpg_* · RPG Creator (.isbrpg) (8)

rpg_project

Create, inspect or edit a local .isbrpg RPG Creator project. Edits use validated authoring commands and snapshot the previous file.

Parameters (6) · required: file, op
ParameterTypeDescription
file requiredstring
min length 1, max length 32768
op required"create" | "inspect" | "update"
optionsobject
commandsarray of object
min 1 items, max 1000 items
outstring
min length 1, max length 32768
overwriteboolean

rpg_import_project

Import a compatible local RPG project folder or project marker with data, images, audio, effects, fonts and plugin sources into .isbrpg. A data-folder input imports JSON only. Import preserves files without executing JavaScript or copying third-party runtimes.

Parameters (3) · required: source, out
ParameterTypeDescription
source requiredstring
min length 1, max length 32768
out requiredstring
min length 1, max length 32768
overwriteboolean

rpg_export_project

Export RPG Creator project data, imported binary resources and plugin sources into a compatible local folder or ZIP. Set dataOnly:true for JSON-only interchange. This resource export does not include a player. Existing files require overwrite:true.

Parameters (9) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1, max length 32768
out requiredstring
min length 1, max length 32768
overwriteboolean
dataOnlyboolean
format"folder" | "zip"
encryptImagesboolean
encryptAudioboolean
encryptionKeystring
excludeUnusedboolean

rpg_export_html

Export a self-contained playable HTML file using the RPG Creator interpreter, embedded imported resources and browser plugin host. Unsupported operations report runtime diagnostics.

Parameters (4) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1, max length 32768
out requiredstring
min length 1, max length 32768
overwriteboolean
excludeUnusedboolean

rpg_export_game

Build an offline portable Windows game, macOS application ZIP (arm64 or x64), or standalone web folder with embedded assets and plugins. Uses bundled runtimes; destination must be empty.

Parameters (5) · required: file, out
ParameterTypeDescription
file requiredstring
min length 1, max length 32768
out requiredstring
min length 1, max length 32768
target"windows" | "web" | "macos"
architecture"arm64" | "x64"
excludeUnusedboolean

rpg_character

Compose RPG Creator character SVG sheets from a recipe with optional imported PNG component layers, offsets, opacity and recoloring. Writes a local SVG and returns its recipe.

Parameters (4) · required: out
ParameterTypeDescription
out requiredstring
min length 1, max length 32768
recipemap of any
type"face" | "walk" | "damage" | "battler"
overwriteboolean

rpg_diagnostics

Inspect RPG Creator project validation, supported runtime scope and project interchange limits. Preserved records do not imply support for every imported behavior.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1, max length 32768

rpg_playtest

Run local RPG Creator playtest sessions: movement, events/choices, battle, switches/variables and portable save state. Sessions survive calls in this MCP process; save explicitly before restart. Unsupported operations report runtime diagnostics.

Parameters (17) · required: op
ParameterTypeDescription
op required"start" | "list" | "state" | "move" | "interact" | "update" | "advance" | "choose" | "input_number" | "select_item" | "shop" | "battle_start" | "battle" | "switch" | "variable" | "save" | "load" | "reset" | "stop"
filestring
min length 1, max length 32768
sessionstring
min length 1, max length 100
dxinteger
-1–1
dyinteger
-1–1
eventIdinteger
≥ 1
framesinteger
1–3600
choiceinteger
≥ -1
Zero-based choice index; -1 requests cancel.
actionobject
shopActionobject
troopIdinteger
1–9999
canEscapeboolean
canLoseboolean
idinteger
0–9999
valueboolean or number
outstring
min length 1, max length 32768
overwriteboolean

Scripting and JavaScript

Scene scripts and the V8 JavaScript runtime.

script_* · Scene scripts (8)

script_analyze

Compile Lua 5.4 with the bundled VM or parse a GDScript/JavaScript scene subset; report syntax/capability diagnostics. Does not execute source or access host globals.

Parameters (3)
ParameterTypeDescription
sourcestring
max length 262144
sourceFilestring
min length 1
language"gdscript" | "javascript" | "lua"

script_attach

Attach embedded GDScript, JavaScript or Lua source to a level node. Lua compiles in its bundled VM; bounded GDScript/JavaScript reject unsupported syntax. Native profile preserves full GDScript for runtime_workspace_project/full engine.

Parameters (9) · required: path, nodeId
ParameterTypeDescription
path requiredstring
min length 1
outstring
min length 1
nodeId requiredstring
sourcestring
max length 262144
sourceFilestring
min length 1
language"gdscript" | "javascript" | "lua"
profile"bounded" | "native"
enabledboolean
exportsmap of number or string or boolean or null or array of number or string or boolean or null or object or map of number or string or boolean or null

script_detach

Remove a node script or enable/disable its execution. Resets temporary simulation state without changing source transforms.

Parameters (4) · required: path, nodeId, action
ParameterTypeDescription
path requiredstring
min length 1
outstring
min length 1
nodeId requiredstring
action required"remove" | "enable" | "disable"

script_step

Execute local Lua 5.4 or bounded scene lifecycle callbacks. Lua VM state persists by deterministic operation replay; bounded continuations/variables persist directly. Authoring transforms remain unchanged until explicitly applying simulation.

Parameters (7) · required: path
ParameterTypeDescription
path requiredstring
min length 1
outstring
min length 1
dtnumber
0–0.25
stepsinteger
1–1200
actionsmap of number or boolean
eventsarray of object
max 128 items
limitsobject

script_event

Call a declared script method, emit a declared signal, pause/resume the local runtime or clear its diagnostics. No host JavaScript is evaluated.

Parameters (7) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
outstring
min length 1
action required"call" | "signal" | "pause" | "resume" | "clear_errors"
nodeIdstring
namestring
argsarray of number or string or boolean or null or array of number or string or boolean or null or object or map of number or string or boolean or null
max 64 items
limitsobject

script_inspect

Inspect authored script source metadata and compilation diagnostics, plus an existing simulation state. Reading alone never executes _ready.

Parameters (4) · required: path
ParameterTypeDescription
path requiredstring
min length 1
nodeIdstring
includeSourceboolean
includeVariablesboolean

script_resource

Register or remove a local JSON/text-scene resource for preload(...).instantiate(). Embeds declarative scene data; source resource paths are never fetched or used as host file access by scripts.

Parameters (5) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
outstring
min length 1
action required"add" | "remove" | "list"
keystring
sourcestring
min length 1

script_simulation

Discard temporary script/playtest state, or explicitly apply its scene-object changes to the authoring level. Reset leaves the authored source scripts and transforms intact.

Parameters (3) · required: path, action
ParameterTypeDescription
path requiredstring
min length 1
outstring
min length 1
action required"reset" | "apply"

v8_* · JavaScript (V8) runtime and export (13)

v8_capabilities

Inspect the real local V8 JavaScript language profile, explicit local ESM modules, available scene/input/timer/math APIs, live-closure persistence and JSON snapshot boundaries.

No parameters.

v8_project_save

Validate and save a portable full-JavaScript source project with explicit local modules. No host filesystem/network/process API is exposed inside its scripts.

Parameters (11) · required: out, modules
ParameterTypeDescription
out requiredstring
min length 1
modules requiredmap of string
entrystring
scenemap of any
statemap of any
inputmap of any
assetsmap of any
titlestring
max length 150
timeoutMsnumber
20–30000
memoryMbnumber
16–512
overwriteboolean

v8_open

Start a persistent isolated local V8 worker for selected source modules. Supports normal ECMAScript classes/closures/generators/Promises, static/dynamic ESM and lifecycle functions/default classes; standard Node host modules are unavailable.

Parameters (8)
ParameterTypeDescription
filestring
min length 1
modulesmap of string
entrystring
scenemap of any
statemap of any
inputmap of any
timeoutMsnumber
20–30000
memoryMbnumber
16–512

v8_step

Advance a live JavaScript game session by a local simulation frame, update input/events and return actual authored scene/state, emitted events, timer metadata and script diagnostics.

Parameters (4) · required: session
ParameterTypeDescription
session requiredstring
min length 1
dtnumber
0–60
inputmap of any
eventsarray of any
max 10000 items

v8_call

Call a named export or default-class method in a live local JavaScript session with JSON arguments; the runtime supplies api as its first argument.

Parameters (3) · required: session, name
ParameterTypeDescription
session requiredstring
min length 1
name requiredstring
min length 1, max length 256
argsarray of any

v8_inspect

Inspect a live JavaScript worker or list open sessions. Closure/private-field state persists while the worker lives; only explicit JSON state can be snapshotted.

Parameters (1)
ParameterTypeDescription
sessionstring
min length 1

v8_snapshot

Save or restore explicit JSON scene/state/input/time in a persistent worker. Does not claim to capture JavaScript heaps, closures, Promise continuations or timer callbacks.

Parameters (4) · required: session
ParameterTypeDescription
session requiredstring
min length 1
outstring
min length 1
valuemap of any
overwriteboolean

v8_checkpoint

Save a verified complete session replay checkpoint: source, private fields/closures/generators, pending virtual timers/Promises/call jobs and recorded Date/random observations. Every operation is verified on resume; this is reconstruction, not a raw V8 heap dump.

Parameters (3) · required: session
ParameterTypeDescription
session requiredstring
min length 1
outstring
min length 1
overwriteboolean

v8_resume

Resume a full local JavaScript session from its checkpoint in a new worker, verifying all recorded results/errors and nondeterministic observations.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1

v8_call_job

Start/poll a nonblocking exported async method. The game can continue stepping while it awaits virtual timers; pending calls survive full session checkpoints.

Parameters (5) · required: session, action
ParameterTypeDescription
session requiredstring
min length 1
action required"start" | "status"
namestring
argsarray of any
idstring

v8_resume_job

Start/poll/cancel a long full-session replay without holding one protocol request open. Progress counts verified operations; cancellation terminates the new worker and keeps the checkpoint file.

Parameters (3) · required: action
ParameterTypeDescription
action required"start" | "status" | "cancel"
filestring
min length 1
idstring

v8_close

Terminate a selected local JavaScript worker and release its live closures/timers. Source files and explicit JSON saves remain local.

Parameters (1) · required: session
ParameterTypeDescription
session requiredstring
min length 1

v8_export_game

Export an actual playable local JavaScript game with full native module Worker behavior and bundled 2D/3D player. Windows bundles its portable desktop runtime; Web writes local files for HTTP origins and can include a portable offline launcher. Destination must be empty.

Parameters (8) · required: file, outDir, target
ParameterTypeDescription
file requiredstring
min length 1
outDir requiredstring
min length 1
target required"web" | "windows"
titlestring
max length 150
includeLauncherboolean
widthnumber
320–4096
heightnumber
240–2160
assetFilesmap of string

Shaders

Shader graphs and shader source materials.

shader_* · Shader graph and shader materials (13)

shader_graph_project

Create, inspect or update a local visual material graph. Spatial/canvas output, editable nodes/ports, local textures, source compilation and actual WebGL/full-engine previews.

Parameters (6) · required: file, op
ParameterTypeDescription
file requiredstring
min length 1
op required"create" | "inspect" | "update"
namestring
max length 200
kind"spatial" | "canvas_item"
unshadedboolean
execution"webgl" | "native"

shader_graph_node

Add/update/remove/list typed visual shader nodes. Edit numeric/vector/color values, uniforms, components, UV set, node positions/defaults, or embed a local image texture. Connections are retained by node ID.

Parameters (9) · required: file, op
ParameterTypeDescription
file requiredstring
min length 1
op required"add" | "update" | "remove" | "list"
idstring
type"scalar" | "vector" | "color" | "uniform" | "texture" | "uv" | "time" | "normal" | "view" | "vertex" | "add" | "subtract" | "multiply" | "divide" | "power" | "minimum" | "maximum" | "sine" | "cosine" | "absolute" | "fract" | "floor" | "normalize" | "length" | "dot" | "cross" | "mix" | "clamp" | "smoothstep" | "compose" | "component" | "output"
xnumber
ynumber
paramsobject
defaultsmap of number or array of number
imagestring
min length 1

shader_graph_connect

Connect an output to one named input port or disconnect a port. Cycles, missing nodes and nonexistent input ports are rejected. Inspect returns the actual graph edge list.

Parameters (5) · required: file, op
ParameterTypeDescription
file requiredstring
min length 1
op required"connect" | "disconnect" | "inspect"
fromstring
tostring
inputstring

shader_graph_compile

Compile the actual graph to typed source and a shader material document. Returns source plus uniform/texture bindings; source compilation alone does not claim GPU execution.

Parameters (3) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
sourceOutstring
min length 1

shader_graph_preview

Compile and actually execute a visual material graph in the bundled shader panel, using its selected WebGL or full-engine backend; returns the native PNG capture and driver/compiler diagnostics.

Parameters (4) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outstring
min length 1
shape"sphere" | "plane" | "box" | "torus"
resolution128 or 256 or 512 or 1024

shader_create

Create a local shader material from supported spatial/canvas source or plain GLSL vertex+fragment code. No shader text is evaluated as JavaScript.

Parameters (11) · required: out
ParameterTypeDescription
out requiredstring
min length 1
namestring
language"godot" | "glsl"
glslVersion1 or 3
execution"webgl" | "native"
includesmap of string
sourcestring
max length 262144
sourceFilestring
min length 1
vertexSourcestring
max length 262144
fragmentSourcestring
max length 262144
uniformsmap of number or boolean or array of number or boolean

shader_validate

Validate material structure and source-language subset; returns supported uniforms/functions and explicit unsupported-feature errors. This source check does not claim GPU compilation.

Parameters (1) · required: file
ParameterTypeDescription
file requiredstring
min length 1

shader_translate

Translate supported spatial/canvas shader stages to GLSL code fragments used by the real local renderer. Optional output directory writes translation and metadata.

Parameters (2) · required: file
ParameterTypeDescription
file requiredstring
min length 1
outDirstring
min length 1

shader_uniform

Set/reset a typed uniform or embed/clear a local image sampler in the shader material. Texture files are decoded locally and embedded as PNG; remote texture URIs are rejected.

Parameters (6) · required: file, name, operation
ParameterTypeDescription
file requiredstring
min length 1
name requiredstring
operation required"set" | "reset" | "texture" | "clear_texture"
valuenumber or boolean or array of number or boolean
texturestring
min length 1
flipYboolean

shader_scene_material

Attach/remove/inspect a validated shader document on an actual 3D scene material. The scene WebGL renderer executes it through its physical/basic lighting pipeline.

Parameters (6) · required: scene, operation
ParameterTypeDescription
scene requiredstring
min length 1
outstring
min length 1
operation required"attach" | "remove" | "inspect"
shaderstring
min length 1
materialIdstring
nodeIdstring

shader_native_project

Write an unchanged full source shader plus local includes/textures into a native project with sphere/plane/box/torus, canvas, particles, sky or fog fixture. The actual bundled engine handles light/depth/screen processors and multipass materials; forward-renderer-only capabilities remain engine-profile limits.

Parameters (4) · required: file, outDir
ParameterTypeDescription
file requiredstring
min length 1
outDir requiredstring
min length 1
shape"sphere" | "plane" | "box" | "torus"
resolution128 or 256 or 512 or 1024

shader_compile

Compile/link an actual shader in the bundled local WebGL renderer and return driver diagnostics. Starts the bundled platform if needed; source checks alone do not satisfy this tool.

Parameters (5) · required: file
ParameterTypeDescription
file requiredstring
min length 1
timenumber
0–86400
shape"sphere" | "plane" | "box" | "torus"
resolution128 or 256 or 512 or 1024
uniformsmap of number or boolean or array of number or boolean

shader_preview

Compile and actually render a shader with the bundled WebGL runtime, returning a PNG and optionally writing it locally. Does not use a CPU color approximation.

Parameters (6) · required: file
ParameterTypeDescription
file requiredstring
min length 1
timenumber
0–86400
shape"sphere" | "plane" | "box" | "torus"
resolution128 or 256 or 512 or 1024
uniformsmap of number or boolean or array of number or boolean
outstring
min length 1

Game runtime and native engine

The native project editor, runtime sessions, GDExtension and export.

runtime_* · Game runtime: projects, editor, sessions and export (20)

runtime_editor_open

Open the persistent bundled native project editor: 2D/3D scenes, resources, native animation, scripts, shaders and physics authoring. The isolated editor has no desktop preload or external executable.

Parameters (3)
ParameterTypeDescription
sourcestring
min length 1
demoboolean
visibleboolean

runtime_editor_scene

Edit actual native scenes with editor undo actions. Add nodes with typed native properties, remove/select nodes, open or create a scene, save it, or scan changed resources.

Parameters (7) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"inspect" | "open" | "create" | "add" | "remove" | "select" | "save" | "scan" | "play" | "play_current" | "stop"
pathstring
min length 1
filestring
min length 1
classstring
min length 1
namestring
min length 1
propertiesmap of object

runtime_editor_file

Read/write/delete local project source files in the persistent editor VFS. Writes support scripts, scene/resource text and shader sources up to 8 MB. Save/sync before export; resource scan refreshes the editor.

Parameters (5) · required: id, action, path
ParameterTypeDescription
id requiredstring
min length 1
action required"read" | "write" | "delete"
path requiredstring
min length 1
textstring
max length 8388608
scanboolean

runtime_editor_sync

Save the edited native scene and synchronize the full source/import VFS to the owned local project cache, including deletions. The resulting project can be packed, exported or run without closing the editor.

Parameters (1) · required: id
ParameterTypeDescription
id requiredstring
min length 1

runtime_editor_object

Create/edit actual native resources and call native singleton methods in the persistent editor. Object handles and typed values round-trip; ResourceSaver.save can persist authored materials, animation libraries and other resources into res:// files.

Parameters (9) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"create" | "call" | "get" | "set" | "release"
classstring
min length 1
singletonstring
min length 1
handlestring
min length 1
methodstring
min length 1
propertystring
min length 1
argsarray of object
max 100 items
valueobject

runtime_info

Inspect bundled full engine profiles, pinned version and active isolated local sessions.

No parameters.

runtime_project_inspect

Inspect local full-engine project configuration, asset import cache and exact web-profile diagnostics without executing code.

Parameters (1) · required: source
ParameterTypeDescription
source requiredstring
min length 1

runtime_project_create

Create a real full-engine source project with native GDScript classes, await, pattern matching, shader, physics floor, camera and light.

Parameters (1) · required: directory
ParameterTypeDescription
directory requiredstring
min length 1

runtime_workspace_project

Convert a local authored level/3D scene JSON into an editable native game project with embedded assets, native materials, collisions and playable movement controller; optionally import/run it. Conversion warnings identify unsupported authoring-only behaviors.

Parameters (7) · required: kind, input, out
ParameterTypeDescription
kind required"level" | "scene3d"
input requiredstring
min length 1
out requiredstring
min length 1
runboolean
visibleboolean
storageKeystring
min length 1, max length 1000
fpsinteger
1–120

runtime_project_open

Stage and import a folder/project.godot/ZIP/PCK through the bundled full editor WASM, then run the full native game engine on an isolated loopback origin. All assets stay local.

Parameters (7)
ParameterTypeDescription
sourcestring
min length 1
demoboolean
importAssetsboolean
visibleboolean
storageKeystring
min length 1, max length 1000
timeoutinteger
1000–600000
argsarray of string
max 100 items

runtime_session

Inspect native compiler/runtime logs, pause/resume a game, reveal its isolated window or close it.

Parameters (2) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"state" | "pause" | "resume" | "show" | "close"

runtime_scene

Inspect the actual running engine scene tree or typed editable native node properties, load a local res:// scene, or set a native node property. Vector/Color values use {kind,values}.

Parameters (6) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"inspect" | "properties" | "change" | "set"
pathstring
scenestring
propertystring
valueobject

runtime_call

Call an actual native scene-node method and await its result. Source executes inside the bundled engine, with no desktop preload or Node globals.

Parameters (4) · required: id, method
ParameterTypeDescription
id requiredstring
min length 1
pathstring
method requiredstring
min length 1
argsarray of object
max 100 items

runtime_input

Press/release native engine InputMap actions locally. Use zero to release; values in (0,1] press with analog strength.

Parameters (2) · required: id, actions
ParameterTypeDescription
id requiredstring
min length 1
actions requiredmap of number

runtime_step

Advance the actual engine by a bounded count of native physics ticks, then pause. Script callbacks and native physics execute inside the engine; rendering also continues.

Parameters (3) · required: id
ParameterTypeDescription
id requiredstring
min length 1
framesinteger
1–600
pauseAfterboolean

runtime_object

Create native resources/classes or call/get/set native public singleton/object APIs. Returned Objects/RIDs carry session-local handles; typed vectors, transforms and packed arrays round-trip. Releasing a handle drops the bridge reference.

Parameters (9) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"create" | "call" | "get" | "set" | "release"
classstring
singletonstring
handlestring
methodstring
propertystring
argsarray of object
max 100 items
valueobject

runtime_material

Set a full-engine ShaderMaterial uniform on a mesh, canvas item or particle process material; native shader diagnostics remain available in runtime_session.

Parameters (4) · required: id, path, name, value
ParameterTypeDescription
id requiredstring
min length 1
path requiredstring
name requiredstring
value requiredobject

runtime_capture

Capture the actual native-engine viewport as a PNG, including rendered 2D/3D scenes, native shaders and particles.

Parameters (2) · required: id, out
ParameterTypeDescription
id requiredstring
min length 1
out requiredstring
min length 1

runtime_export

Build a standalone web game or portable Windows game folder using the bundled engine and desktop player. Native import runs first when source is provided. No external executables or installs.

Parameters (7) · required: out, format
ParameterTypeDescription
idstring
min length 1
sourcestring
min length 1
out requiredstring
min length 1
format required"web" | "windows"
titlestring
max length 150
widthinteger
128–7680
heightinteger
128–4320

runtime_pack

Write or inspect the actual full-engine PCK resource archive with verified per-file MD5 hashes. Pack writing alone does not import raw art assets.

Parameters (3) · required: action, source
ParameterTypeDescription
action required"write" | "inspect"
source requiredstring
min length 1
outstring
min length 1

native_* · Native engine: projects, extensions, debugger and export (20)

native_runtime_info

Inspect the bundled Windows engine-library, .NET runtime/compiler, native render profiles and active local sessions. No installed engine or SDK is used.

No parameters.

native_project_open

Stage a local project and run the actual native engine library, including Vulkan Forward+, compute, fog, C# and native extensions. Native code is not an OS security sandbox.

Parameters (12) · required: source
ParameterTypeDescription
source requiredstring
min length 1
mode"game" | "editor"
importAssetsboolean
debugboolean
headlessboolean
hiddenboolean
storageKeystring
breakpointsarray of object
renderer"forward_plus" | "mobile" | "gl_compatibility"
driver"vulkan" | "opengl3" | "d3d12"
softwareboolean
audioDriver"WASAPI" | "Dummy"

native_project_compile

Compile all local C# source with bundled Roslyn plus engine source generators. Supports local managed references; no installed .NET SDK, restore or online package service is required.

Parameters (3) · required: project
ParameterTypeDescription
project requiredstring
min length 1
assemblyNamestring
referencesarray of string
max 1024 items

native_project_recover

Recover project.godot from native project.binary and write editable text copies of binary scenes/resources using the actual engine. Does not reconstruct absent script source or bypass encryption.

Parameters (1) · required: project
ParameterTypeDescription
project requiredstring
min length 1

native_extension_build

Build local C/C++ GDExtension sources with the bundled compiler and C ABI header. Select a supported platform/architecture; Apple SDK-dependent targets report their requirements. Freestanding mode is for API-only sources without system/CRT dependencies.

Parameters (12) · required: project, sources
ParameterTypeDescription
project requiredstring
min length 1
sources requiredarray of string
min 1 items, max 1024 items
outputstring
language"c" | "cpp"
platform"windows" | "linux" | "macos" | "android" | "ios"
architecture"x86_64" | "arm64"
freestandingboolean
optimization"Debug" | "ReleaseFast" | "ReleaseSafe" | "ReleaseSmall"
includesarray of string
definesmap of string or number or boolean
entrystring
descriptorstring

native_extension_initialize

Add the default GDExtension (Best for Performance) scaffold and compile its Windows library using bundled tools. Existing project source is preserved.

Parameters (1) · required: project
ParameterTypeDescription
project requiredstring
min length 1

native_extension_build_default

Build the project native/build.json GDExtension configuration for Windows, Linux, macOS, Android or an iOS ARM64 static C starter. Use macos/universal for Intel and Apple silicon. iOS C++ or system dependencies require an Apple SDK.

Parameters (4) · required: project
ParameterTypeDescription
project requiredstring
min length 1
platform"windows" | "linux" | "macos" | "android" | "ios"
architecture"x86_64" | "arm64" | "universal"
optimization"Debug" | "ReleaseFast" | "ReleaseSafe" | "ReleaseSmall"

native_export_targets

Inspect the included Windows, macOS, Linux, Android and iOS export templates, matching export-engine version, platform prerequisites and project library compatibility.

Parameters (13)
ParameterTypeDescription
projectstring
min length 1
debugboolean
androidKeystorestring
min length 1
androidKeystoreUserstring
androidKeystorePasswordstring
applicationIdstring
appleTeamIdstring
androidSdkPathstring
min length 1
javaSdkPathstring
min length 1
androidFormat"apk" | "aab"
androidTargetSdkinteger
24–99
androidVersionCodeinteger
1–2100000000
androidVersionNamestring
min length 1, max length 100

native_export_presets

Create the five built-in export presets in a project. Existing export_presets.cfg is preserved unless overwrite is explicitly true.

Parameters (11) · required: project
ParameterTypeDescription
project requiredstring
min length 1
titlestring
overwriteboolean
applicationIdstring
appleTeamIdstring
androidSdkPathstring
min length 1
javaSdkPathstring
min length 1
androidFormat"apk" | "aab"
androidTargetSdkinteger
24–99
androidVersionCodeinteger
1–2100000000
androidVersionNamestring
min length 1, max length 100

native_scene

Inspect/select/edit native scene nodes, including the actual persistent editor. Native editor edits enter its undo history.

Parameters (15) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"tree" | "properties" | "get" | "set" | "call" | "pause" | "input" | "editor_inspect" | "editor_open" | "editor_create" | "editor_add" | "editor_remove" | "editor_select" | "editor_save" | "editor_scan"
pathstring
propertystring
valueobject
methodstring
argsarray of object
pausedboolean
actionNamestring
pressedboolean
strengthnumber
0–1
filestring
classstring
namestring
propertiesmap of object

native_object

Create/load native resources and classes; call/get/set singleton or retained Object/RID handles. Typed values accept {kind,values} or returned handles. Resources, rendering devices and native extensions stay in the local process.

Parameters (10) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"create" | "load" | "call" | "get" | "set" | "release"
classstring
resourcestring
handlestring
singletonstring
methodstring
propertystring
valueobject
argsarray of object

native_editor_file

Read/write/delete an actual native editor project source file. Paths remain res:// local; writes refresh the editor filesystem through native_scene editor_scan.

Parameters (4) · required: id, action, path
ParameterTypeDescription
id requiredstring
min length 1
action required"read" | "write" | "delete"
path requiredstring
textstring
max length 8388608

native_debugger

Inspect native debugger messages or execute real breakpoint, continue, step/next/out, stack/locals and expression evaluation commands over an owned loopback connection.

Parameters (6) · required: id
ParameterTypeDescription
id requiredstring
min length 1
message"break" | "continue" | "step" | "next" | "out" | "breakpoint" | "get_stack_dump" | "get_stack_frame_vars" | "evaluate" | "set_skip_breakpoints" | "set_ignore_error_breaks" | "scene:request_scene_tree" | "scene:inspect_object" | "scene:set_object_property" | "servers:draw" | "get_memory_usage"
argsarray of object
threadnumber or object
afterinteger
≥ 0
limitinteger
1–5000

native_compute

Compile and dispatch actual Vulkan GLSL compute against a float32 storage buffer at set0/binding0, then return GPU readback. Full multi-resource compute is also accessible through native_object RenderingDevice APIs.

Parameters (4) · required: id, source, values
ParameterTypeDescription
id requiredstring
min length 1
source requiredstring
min length 1, max length 1048576
values requiredarray of number
min 1 items, max 1048576 items
groupsinteger
1–65535

native_step

Advance the real native engine by a bounded number of physics ticks, then optionally pause. GDScript/C#/physics callbacks execute in the engine.

Parameters (3) · required: id
ParameterTypeDescription
id requiredstring
min length 1
framesinteger
1–600
pauseAfterboolean

native_shader_preview

Compile unchanged spatial/canvas/particle/sky/fog shader source in the actual Windows Forward+ Vulkan renderer. Local includes/textures and typed uniforms stay embedded; reports real compiler/device diagnostics.

Parameters (9) · required: source
ParameterTypeDescription
source requiredstring
min length 1, max length 262144
namestring
shape"sphere" | "plane" | "box" | "torus"
resolution128 or 256 or 512 or 1024
uniformsmap of object
texturesmap of object
includesmap of string
softwareboolean
outstring
min length 1

native_extension_load

Load a local res:// GDExtension descriptor and report actual native initialization status/loaded libraries.

Parameters (2) · required: id, resource
ParameterTypeDescription
id requiredstring
min length 1
resource requiredstring

native_capture

Capture the actual native Windows engine viewport to a local PNG.

Parameters (2) · required: id, out
ParameterTypeDescription
id requiredstring
min length 1
out requiredstring
min length 1

native_session

Inspect native engine logs/status, save editor scenes or close the owned internal runtime host.

Parameters (2) · required: id, action
ParameterTypeDescription
id requiredstring
min length 1
action required"status" | "save" | "close"

native_export

Export a standalone game with bundled templates for Windows, macOS, Linux, Android or iOS. Android includes SDK/JDK/bundletool and creates signed APKs or AAB plus APK/APKS; App Bundles default to target API36 and validate a signed APK round trip; release builds need your signing key; iOS creates an Xcode project with Lua and static libraries included, then requires a Mac/Xcode to build and sign the app. Omit target or select windows-native for the integrated C# Windows host.

Parameters (20) · required: project, out
ParameterTypeDescription
project requiredstring
min length 1
out requiredstring
min length 1
titlestring
target"windows-native" | "windows" | "macos" | "linux" | "android" | "ios"
debugboolean
androidKeystorestring
min length 1
androidKeystoreUserstring
androidKeystorePasswordstring
applicationIdstring
appleTeamIdstring
androidSdkPathstring
min length 1
javaSdkPathstring
min length 1
androidFormat"apk" | "aab"
androidTargetSdkinteger
24–99
androidVersionCodeinteger
1–2100000000
androidVersionNamestring
min length 1, max length 100
renderer"forward_plus" | "mobile" | "gl_compatibility"
driver"vulkan" | "opengl3" | "d3d12"
softwareboolean
audioDriver"WASAPI" | "Dummy"

Mobile export

Android signing and App Bundles, and mobile export information.

mobile_* · Mobile export information (1)

mobile_export_info

Inspect local Android APK/AAB tools and iOS project versus IPA prerequisites without opening the desktop. No download or remote build occurs.

Parameters (9)
ParameterTypeDescription
projectstring
min length 1
debugboolean
androidFormat"apk" | "aab"
androidKeystorestring
min length 1
androidKeystoreUserstring
androidKeystorePasswordstring
appleTeamIdstring
androidSdkPathstring
min length 1
javaSdkPathstring
min length 1

android_* · Android signing and bundles (2)

android_signing_key_create

Create a local RSA3072 PKCS12 release signing keystore using the bundled JDK. Never overwrites an existing key; returns the public certificate fingerprint. Keep your key and password to sign updates.

Parameters (7) · required: out, alias, password
ParameterTypeDescription
out requiredstring
min length 1
alias requiredstring
min length 1, max length 128
password requiredstring
min length 6, max length 4096
distinguishedNamestring
max length 2048
validityDaysinteger
1–36500
androidSdkPathstring
min length 1
javaSdkPathstring
min length 1

android_bundle_build

Build and sign an Android App Bundle from a local compiled APK with bundled aapt2, bundletool and JDK. Validates the AAB and generates a signed universal APK/APKS round trip, checking game payload identity and 16 KiB alignment. Does not compile custom Java, contact Play or execute a device.

Parameters (9) · required: apk, out, keystore, alias, password
ParameterTypeDescription
apk requiredstring
min length 1
out requiredstring
min length 1
keystore requiredstring
min length 1
alias requiredstring
min length 1, max length 128
password requiredstring
min length 1, max length 4096
keyPasswordstring
min length 1, max length 4096
targetSdkinteger
24–99
androidSdkPathstring
min length 1
javaSdkPathstring
min length 1

Command line

The portable folder includes command-line tools for batch image export, an Aseprite-style batch subset, PXL pixel-art-as-code builds, and license management for headless machines. They all run with the bundled Isberg Labs.exe, so no separate runtime is needed.

Running the tools

ToolRunPurpose
Batch exportresources\app\cli\gamebench.jsConvert, repair, recolor and export images and sprites; build sprite sheets
Aseprite-compatible batchresources\app\cli\aseprite-compat.mjs, or gamebench.js -bStrict, ordered batch operations following the Aseprite command-line option names
PXLresources\app\cli\pxl.jsBuild, inspect and list PXL .px.js art files
LicenseMCP.cmd --license …Activate, check, list and deactivate devices; start a trial

Like the studio and the MCP server, the three scripts need this device's activated license or trial; without one they print Isberg Labs license required: … and exit with code 1. Their --help, --version and --capabilities output works without a license.

The three scripts run inside Isberg Labs.exe in script mode: set ELECTRON_RUN_AS_NODE=1, then pass the script path followed by its arguments. Relative paths resolve against the current folder. MCP.cmd sets the variable itself.

PowerShell

cd 'C:\Isberg Labs'
$env:ELECTRON_RUN_AS_NODE = '1'
& '.\Isberg Labs.exe' '.\resources\app\cli\gamebench.js' --help
& '.\Isberg Labs.exe' '.\resources\app\cli\gamebench.js' '.\Projects\hero.isbsprite' --scale 4 --save-as '.\Projects\[email protected]'
& '.\Isberg Labs.exe' '.\resources\app\cli\aseprite-compat.mjs' -b '.\Projects\hero.isbsprite' --save-as '.\Projects\frame001.png'
& '.\Isberg Labs.exe' '.\resources\app\cli\pxl.js' build '.\Projects\art.px.js'
Remove-Item Env:ELECTRON_RUN_AS_NODE
.\MCP.cmd --license status

Command Prompt (cmd)

cd /d "C:\Isberg Labs"
set ELECTRON_RUN_AS_NODE=1
"Isberg Labs.exe" resources\app\cli\gamebench.js --help
"Isberg Labs.exe" resources\app\cli\gamebench.js Projects\hero.isbsprite --scale 4 --save-as Projects\[email protected]
"Isberg Labs.exe" resources\app\cli\aseprite-compat.mjs -b Projects\hero.isbsprite --save-as Projects\frame001.png
"Isberg Labs.exe" resources\app\cli\pxl.js build Projects\art.px.js
set ELECTRON_RUN_AS_NODE=
MCP.cmd --license status
Caution. While ELECTRON_RUN_AS_NODE is set in a terminal window, starting Isberg Labs.exe from that window does not open the desktop. Clear the variable afterwards as shown.

License commands

MCP.cmd --license runs one license command and exits; it does not start the MCP server. It reads and writes the same activation as the desktop (Data\license.json, or ISBERG_LICENSE_DIR). Activation, status checks, device lists, deactivation and trials contact the license server, so they need an internet connection.

CommandWhat it doesPrints
MCP.cmd --license statusValidates the saved license online now and reports the result. With no saved key it reports the local state without going online. MCP.cmd --license alone does the same.Status JSON
MCP.cmd --license activate <key>Activates this device with your license key.Status JSON
MCP.cmd --license trialRequests this computer's 14-day free trial and activates it. Asking again returns the same trial.Status JSON
MCP.cmd --license devicesLists the devices that use the saved license.JSON array of id, name, platform, created, current
MCP.cmd --license deactivateDeactivates this device and removes its local activation.{"deactivated", "current"}
MCP.cmd --license deactivate <deviceId>Frees another device's slot, for example a replaced PC. Take the ID from devices.{"deactivated", "current"}

Status fields

FieldMeaning
licensedtrue when tools and the desktop can run.
code, messageState code (table below) and its explanation.
keyThe key, masked except for its last six characters.
licenseId, machineId, deviceLicense and device identifiers, and this computer's name.
maxDevicesDevices allowed at a time (1).
validatedAtTime of the last successful online validation.
graceEndsAt, daysLeftWhen the license stops working without another online validation, and the days remaining.
graceDaysOffline grace length (14).
revalidateDue, warningAn online check is due; the grace period is close to running out.
trial, trialEndsAt, trialDaysLeft, trialWarningWhether this is a trial, when it ends, days left, and whether it ends soon.
trialAvailable, trialDays, canBuyWhether this build offers trials, the trial length, and whether a store page is configured.
lastError, nextAttemptAtPresent when an online check failed: the error and when an automatic retry is allowed.

State and error codes

CodeMeaning
VALIDLicense active on this device.
NOT_ACTIVATEDNo license key is saved on this device.
KEY_INVALIDThe key was not found.
DEVICE_LIMITThe license is active on another device; deactivate that device first.
DEACTIVATEDThis device was deactivated; activate it again.
SUSPENDED, BANNED, EXPIRED, INVALIDThe license cannot be used; contact Isberg Labs support.
OFFLINE_TOO_LONGNot validated online for more than 14 days; connect and retry.
CLOCKThe system clock is earlier than the last check; correct it and retry online.
DEVICE_MISMATCHThe saved activation belongs to another computer.
TAMPEREDThe saved activation is damaged or was modified.
NETWORK, SERVICE, SIGNATUREThe license server could not be reached, rejected the request, or sent a response that could not be verified.
BUSYAnother Isberg Labs process is contacting the license server.
TRIAL_ENDED, TRIAL_USED, TRIAL_LOCKEDThe trial is over, this computer already used its trial, or the trial key belongs to another computer.
TRIAL_UNAVAILABLE, TRIALS_PAUSED, TRIALS_BUSY, RATE_LIMITEDTrials are not available right now; try later.

Exit codes: 0 success, 1 license error (printed as License error (CODE): message), 2 unknown subcommand (prints the usage line). See License for the rules behind these states.

Batch export (gamebench.js)

Usage: gamebench.js <input…> [options]. Inputs can be .png, .apng, .gif, .webp, .jpg/.jpeg, .bmp, .tif/.tiff, .avif and .exr images (animated files become frames), .isbsprite documents (and legacy .gbsprite), .aseprite/.ase/.pforge imports, or folders (their images, sorted naturally). Each input is processed separately; with several inputs, {title} is added to output names automatically. Options take a value as --option value or --option=value.

Passing -b, --batch, --aseprite-compat, --script, --script-param or --capabilities hands the whole command line to the Aseprite-compatible batch. The Pixel & animation chapter describes the export options in detail.

Input and information

OptionEffect
--sequenceJoin all inputs as frames of one sprite.
--duration <ms>Frame duration for sequences and sheets (default 100).
--frame-width <px>, --frame-height <px>Treat a single image as a sprite sheet with this cell size.
--infoPrint size, frame, layer, tag and slice counts and color mode as JSON.
--list-layers, --list-tags, --list-slicesPrint layer names; tags with frame range and direction; slices with bounds.
--help, -hPrint the option list.
--quietDo not print a wrote <file> line per output.

Processing

Applied in this order; processing flattens layers.

OptionEffect
--recipe <file.json>Run a re-runnable recipe {"version":1,"steps":[{"op":…,"params":{…}}]} (a JSON array of steps also works). Recipe operations include repairGrid, pixelize, palette, quantize, removeOrphans, repairOutline, removeBackground, hardenAlpha, mergeSimilarColors, scale, scale2x, resize, trim and outline.
--repair-gridRepair upscaled pixel art: detect the grid, resample, clean up.
--pixelize <width>Pixelize to this width (uses --max-colors, default 16, and --dither).
--remove-bgRemove a flat background.
--palette <name|file>Map to a palette: pico-8, sweetie-16, endesga-32, gameboy, nes, resurrect-32, grayscale-4, a .gpl/.hex/.pal/.act file, or a list of hex colors.
--max-colors <n>Reduce to n colors shared over all frames.
--dither <none|bayer2|bayer4|floyd>Dithering for palette mapping and color reduction (default none).
--outline [#hex]Add an outer outline, optionally in this color.

Selection

OptionEffect
--layer <name>Only this layer; repeat for several.
--all-layersInclude hidden layers.
--tag <name>Only this tag's frames.
--frame-range <from,to>Only these frames.
--direction <forward|reverse|pingpong|pingpong-reverse>Playback order (default: each tag's own direction).
--slice <name>Export only this slice's area.
--split-layers, --split-tagsExport each layer or tag separately.
--scale <n>Integer nearest-neighbor upscale.

Output

OptionEffect
--save-as <file>Save as .png, .gif, .webp, .jpg, .tiff, .avif, .svg, .css or .isbsprite. Tokens such as {frame}, {tag} and {layer} produce sequences, for example out/{title}-{tag}-{frame01}.png.
--format-out <f>Force the output format, for example apng, png-sequence, webp-animated or preview (checkerboard and grid).
--loop <n>APNG play count; 0 loops forever (default: keep the imported count).
--filename-format <template>Frame names in sheet JSON, and the --save-as name when it has no tokens.
--background <#hex>Composite onto a solid color (GIF, JPEG).
--quality <0-100>JPEG, WebP and AVIF quality.
--rgbaWrite RGBA PNG. By default PNGs are indexed when they have 256 colors or fewer.
--trim-spriteCrop --save-as output to the union of opaque pixels over all frames.

Filename tokens: {title}, {layer}, {tag}, {frame}, {tagframe}, {extension}, {duration}, {group} and {index}. Digits after frame, tagframe or index set zero padding, as in {frame01}.

Sprite sheet

OptionEffect
--sheet <out.png>Write a sprite sheet.
--data <out.json|out.tres>Write sheet data; a .tres file is a Godot 4 SpriteFrames resource.
--format <json-hash|json-array|texturepacker|godot|phaser|unity>Data format. Default: godot for .tres, otherwise json-hash when --data is given.
--sheet-type <horizontal|vertical|rows|columns|packed>Layout (default horizontal). --sheet-pack is the same as packed.
--sheet-columns <n>, --sheet-rows <n>Fixed column or row count.
--sheet-width <px>, --sheet-height <px>Fixed sheet size.
--border-padding <px>, --shape-padding <px>, --inner-padding <px>Padding around the sheet, between cells and inside cells.
--trimTrim each cel and record source offsets.
--extrude [n]Repeat edge pixels n pixels outward (default 1).
--merge-duplicates, --ignore-empty, --power-of-twoShare identical cells, skip empty frames, round the sheet up to powers of two.
--split-sheetsOne sheet per layer or tag group.
--group-rowsStart each layer or tag group on a new row.
--res-path <res://dir/>Texture path prefix written into Godot data.
gamebench.js Projects\hero.isbsprite --sheet Projects\hero.png --data Projects\hero.json --sheet-type packed --trim --split-tags
gamebench.js Projects\hero.isbsprite --sheet Projects\hero.png --data Projects\hero.tres
gamebench.js Projects\frames --sequence --save-as Projects\anim.gif --duration 80
gamebench.js Projects\upscaled --repair-grid --palette endesga-32 --save-as "Projects\fixed\{title}.png"

Shown without the Isberg Labs.exe prefix; run each line as in Running the tools.

Aseprite-compatible batch (aseprite-compat.mjs)

This frontend follows the option names of the Aseprite command line for the subset it implements. It does not claim full command-line parity; --capabilities prints the exact supported and unsupported option report as JSON.

  • Options run in argument order. Input options (layer, tag, frame and split selection, listings) must come before the file they affect and stay in effect for later inputs.
  • All arguments are parsed and all planned outputs are encoded before anything is written, so a script or encoder failure writes nothing. A disk error during the final write can still leave earlier files.
  • Unknown options, unsupported options, bad values and conflicting outputs are errors, never ignored.
  • .ase, .aseprite and .pforge files can be read but not written.
GroupOptions
General-b/--batch, -p/--preview (print planned operations without running scripts or writing files), --capabilities, -h/-?/--help, --version, -v/--verbose
Before an input file--layer NAME (repeatable; alias --import-layer), --ignore-layer NAME, --all-layers, --tag NAME (alias --frame-tag), --frame-range FROM,TO (zero-based, inclusive, relative to the selected tag), --oneframe, --split-layers, --split-tags, --split-slices, --split-grid, --export-tileset, --list-layers, --list-layer-hierarchy, --list-tags, --list-slices
Save--save-as FILE (PNG sequence, APNG, GIF or WebP animation, JPEG, TIFF, AVIF, .isbsprite), --scale FACTOR, --shrink-to WIDTH,HEIGHT, --crop x,y,w,h, --slice NAME, --trim, --trim-sprite, --trim-by-grid, --filename-format TEMPLATE, --tagname-format TEMPLATE
Sheet--sheet FILE.png, --data FILE.json (--data="" prints JSON to standard output), --format json-hash|json-array, --sheet-type horizontal|vertical|rows|columns|packed, --sheet-pack, --sheet-width, --sheet-height, --sheet-columns, --sheet-rows, --border-padding, --shape-padding, --inner-padding, --extrude, --ignore-empty, --merge-duplicates, --power-of-two-size
Color--palette FILE (replace the latest sprite's palette), --color-mode rgb|grayscale|indexed (converts all previously opened sprites), --dithering-algorithm none|ordered|old|error-diffusion, --dithering-matrix bayer2x2|bayer4x4|bayer8x8
Lua--script-param key=value, --script FILE.lua (runs the bundled Lua 5.4 against the latest input; needs a preceding input)
Not supported--shell, --play-subtags, --debug, --noinapp (rejected with an explanation)
aseprite-compat.mjs -b --tag walk --layer Body Projects\hero.aseprite --save-as Projects\walk.gif
aseprite-compat.mjs -b --list-tags Projects\hero.aseprite Projects\effects.isbsprite --sheet-pack --trim --sheet Projects\atlas.png --data Projects\atlas.json --format json-array
aseprite-compat.mjs -b Projects\hero.isbsprite --script-param color=#cc44ff --script Projects\edit.lua --save-as Projects\edited.isbsprite

Errors exit with code 2 when you run aseprite-compat.mjs directly and code 1 when you reach it through gamebench.js -b. Full behavior, indexed PNG rules and remaining differences are in Pixel & animation.

PXL (pxl.js)

PXL files (.px.js) describe pixel art as code: sprites, scenes, animations and sheets. The same engine powers the Code workspace in the Pixel & animation editor, which re-renders an open .px.js file whenever it changes.

CommandEffect
pxl.js build <art.px.js>Writes PNGs into out\sprites, out\scenes and out\anims (strips with JSON and GIF), sheets with JSON, *_n.png normal maps, and upscaled previews with checkerboard and grid in out\_preview.
pxl.js ascii <art.px.js> <name>Prints one asset as palette keys with x and y rulers; animations print every frame with its duration.
pxl.js list <art.px.js>Lists assets, groups and sheets with their file and line.
pxl.js --helpPrints usage.
Option (build)Effect
--out DIROutput folder (default: an out folder next to the art file).
--only a,bBuild only these assets.
--scale NUpscale factor for the preview images (chosen automatically when omitted).
--no-previewSkip the preview images.

Exit codes: 0 success, 1 build errors or a failed command (messages start with error:), 2 usage error or unknown command. The MCP tools pxl_build, pxl_ascii and pxl_list do the same work.

Troubleshooting

The desktop window opens instead of the command running
ELECTRON_RUN_AS_NODE is not set to 1 in that terminal.
The desktop does not open from a terminal
The variable is still set; clear it with Remove-Item Env:ELECTRON_RUN_AS_NODE (PowerShell) or set ELECTRON_RUN_AS_NODE= (cmd), or start the app from Explorer.
gamebench: Input not found
Relative paths resolve against the terminal's current folder. Change to the portable folder or use absolute paths.
"Reference and legacy sprite formats are import-only"
Save editable sprites as .isbsprite, or export a standard image format.
License error (NETWORK)
License commands need the internet. Check the connection and retry.

File formats reference

This is the master list of the files Isberg Labs can import and export, grouped by area and editor. Use it to find which editor reads a file and what you can deliver to a game engine; the editor chapters explain the options in detail.

Isberg documents and import-only formats

  • Documents you author are saved in Isberg formats (.isberg, .isbsprite, .isbtiles and the others in Isberg documents). They contain Isberg document data, not reference-tool files with a new suffix.
  • Importing a reference-tool file does not make that tool's format the target of the next save. The editable result is saved as an Isberg document; the imported source data can be kept inside it for compatibility.
  • These reference and legacy extensions are import-only and are refused as export destinations: .ase, .aseprite, .asprite, .pforge, .cpt, .laigter, .preset, .presets, .save, .croco, .crocotile, .c3dp.
  • Standard delivery formats (PNG, GIF, WebP, WAV, OBJ, glTF/GLB, FBX, Collada, TMX and others below) are fully available. Engine-specific exports keep the extensions their engine needs.

In the tables, "Yes" means the editor reads (Import) or writes (Export) the format; "—" means it does not.

Images

Pixel & animation

Open images with Open… or Import File (any format)…; export with Export As… or the File menu's Export … entries. See Pixel & animation.

FormatExtensionsImportExportNotes
PNG.pngYesYesAll standard color types: indexed 1/2/4/8-bit, grayscale 1–16-bit, RGB, gray-alpha and RGBA 8/16-bit, all filters and interlacing. Color profile, text, density, EXIF and other ancillary data are kept in the project. Export: PNG, PNG sequence (one file per frame), and Preview PNG (checker + grid).
Indexed PNG.pngYesYesAn indexed sprite exports with its exact palette (PLTE/tRNS) and index values, without renumbering or merging entries. If that cannot be guaranteed, exact RGB/RGBA is written and the export reports why; colors are never quantized.
16-bit PNG (PNG16).pngYesYesOpened as an exact 16-bit document. Edit and export with Sprite → Precision — 16-bit / HDR… (Export PNG16 / float32 EXR). Export can keep the source encoding or convert to sRGB, linear sRGB, Rec2020 PQ or Rec2020 HLG; out-of-range values are refused, not clamped.
OpenEXR.exrYesYesImport: single-part, uncompressed scanline RGBA HALF/FLOAT, linear sRGB/Rec709 primaries, matching zero-origin windows, finite values. Export: uncompressed RGBA FLOAT32 through the precision exporter. Compressed, tiled, deep, multipart and other variants are refused.
Animated PNG (APNG).apng, .pngYesYesAll color types, blending and disposal modes, loop count and exact delays. Export Animated PNG with play count; indexed animations keep one shared palette. Limits: 128 MiB input, 1,000 frames, 16,777,216 total animation pixels.
GIF.gifYes (animated)YesAnimated GIF. Colors are reduced to a 256-color palette when needed; an optional background color flattens transparency.
WebP.webpYes (animated)YesWebP (still) or Animated WebP, with quality or lossless options.
JPEG.jpg, .jpegYesYesTransparency is flattened onto a background (white by default).
TIFF.tif, .tiffYesYesStill image export.
AVIF.avifYesYesStill image export.
BMP.bmpYes—
SVG.svg—YesPixel art as vector rectangles (SVG / CSS).
CSS box-shadow.css + .html—YesCSS box-shadow (+ HTML); animations become CSS keyframes.
Image sequenceimage files or a folderYesYesImport Image Sequence (files)… / (folder)… (sorted naturally); export as PNG sequence.
Layer or reference imageany supported imageYes—Import as New Layer…, Import as Reference Layer….
Normal map_n.png—YesFile menu Export normal map (_n.png)….
SlicesPNG + slices.json—YesExport slices… writes every slice as a PNG with a JSON index.
Limits. The normal export and sprite-sheet export refuse 16-bit and float documents; use the precision exporter, or convert to 8-bit explicitly. PNG does not store floating-point samples.

Images in other editors

EditorImportExport
Studio asset shelfPNG, APNG, JPEG, WebP, GIF, BMP, TIFF, AVIF (+)— (assets are embedded in the project)
Textures & terrainImages through Open images, + Import textures, Import images, Open sprite sheet and Import heightmapPNG (Export texture PNG, Save PNG texture, Download clean PNG, Export PNG), JPEG and SVG (Download selected format: PNG, JPEG, SVG as exact pixel shapes or smooth traced curves; Download SVG), PlayStation .TIM (Save .TIM (PS1 binary)), and ZIPs listed under Archives
Sprite lightingSource image (Import image)PNG of the displayed map (Export displayed PNG) or of every generated map (Export all maps)
World builder—Export map (PNG), Export map (SVG), Export PNG, Save PNG, Save screenshot (map sheets and views)
Avatar stagePNG layers (Add PNG, Resolve sprite PNGs)Snapshot PNG (transparent background available)
RPG CreatorPNG character components; images in Import resourcesCharacter sheets as Export SVG and Export PNG
3D scene & animation, Tile modeler, Vertex painter, Shader graph, Shader materials, Game runtimePNG and JPEG texture sidecars with imported models (3D scene); the atlas image (Tile modeler Import image); PNG, JPEG and WebP textures (Shader graph and Shader materials)Viewport images: Viewport PNG (3D scene), PNG (Tile modeler), Snapshot PNG (Vertex painter), Export PNG at 128 to 1024 px (Shader materials), Capture (Game runtime, game-viewport.png)

Sprite sheets and engine metadata

In Pixel & animation, Export Sprite Sheet… writes a PNG sheet (layouts Horizontal strip, Vertical strip, By rows, By columns, Packed; optional trimming) and an optional data file:

Data file optionOutput
JSON hash (Aseprite) / JSON array (Aseprite).json in the Aseprite-style layout, with frame tags.
TexturePacker hash + animations.json in TexturePacker hash form with animation lists.
Godot 4 SpriteFrames (.tres).tres SpriteFrames resource plus a -godot.md note. Also on the File menu as Export Godot SpriteFrames….
Phaser 3 (JSON array + notes)JSON array plus a -phaser.md note.
Unity (JSON + import notes)JSON plus a -unity.txt note.
No data fileThe PNG sheet only.
  • Import Sprite Sheet… slices a sheet image into frames by grid (rows, columns, strips, cell size, padding) with a live preview.
  • Export LPC sheet… writes a sheet in the Universal LPC layout.
  • Textures & terrain exports sprite sheets too (Export sprite sheet, Download PNG + layout ZIP), and its sprite extractor cuts sheets into separate sprites (Download sprites ZIP, Download selected PNG).
  • Avatar stage reads multi-row sprite sheets as animated layers.

Palettes

FormatExtensionsImportExportNotes
GIMP palette.gplYesYesKeeps color names.
Lospec / plain hex list.hex, .txtYesYes (.hex)
JASC palette.palYesYes
Adobe Color Table.actYesYes
Palette from an image.png, .gif, .jpg, .jpeg, .webp, .bmpYesYes (PNG, one pixel per color)Up to 256 colors are taken from the image.

Pixel & animation uses Import palette file… and Export palette file…. Textures & terrain has Import palette JSON, Save palette JSON and Export palette; Vertex painter saves and loads swatches as JSON (Save swatches, Load swatches, Swatches from image).

Tiles and tile maps

FormatExtensionsImportExportEditor and notes
Tiled TMX map / TSX tileset.tmx, .tsxYesYes (TMX)Formats & interchange: multiple atlas and image-collection tilesets, selected external TSX, XML/CSV/base64 data with gzip, zlib or Zstandard, orthogonal, isometric, staggered, hexagonal and oblique maps, finite layers and infinite chunks, flip flags, height layers. Export TMX · multi atlas with TMX data csv/base64/xml, TMX projection and Preserve chunks; 3D scenes are converted from floor tiles or by UV/color projection or surface voxels. 3D scene & animation also imports TMX and exports floor tiles as TMX.
Tiled JSON map.tmjYesYesPixel & animation tileset panel: Import .tmj… (with its tileset image) and Export .tmj… (map plus tileset PNG).
Tile map CSV.csv—YesPixel & animation CSV… (tile IDs, −1 for empty).
Tileset and map images.pngYesYesPixel & animation Import PNG…, Export PNG…, Map PNG…, and Open level image… (split an image into unique tiles and a map).
Isberg tile clipboard.isbtileclipYesYesMCP pixel_tile_copy and pixel_tile_paste: tile IDs, flips, empty cells, images and metadata.
Isberg tile project.isbtilesYesYesTile modeler (Open, Save), Formats & interchange (Isberg tiles (.isbtiles)), 3D scene & animation (import).
Crocotile project.croco, .crocotile, .c3dpYes—Formats & interchange; import only, save the result as .isbtiles.
RPG tile sheets.pngYes—RPG Creator resource folders (img/tilesets and others).

Textures, terrain and world maps

EditorImportExport
Textures & terrainImages; video (+ Import a video) and a soundtrack (Open soundtrack); OBJ models with UVs (Import your model (.obj), Import OBJ mesh with UVs); heightmap images; project, animation, terrain, settings and recipe JSON (Open project, Open animation, Open terrain, Load settings, Import recipe JSON)Export textured GLB; Export OBJ + MTL + textures ZIP; Export terrain + foliage GLB; Export separate chunks ZIP; Export baked maps ZIP; Export material maps ZIP; Export Godot + Blender bundle (ZIP with a Godot scene, script and shader, a Blender import script, mesh JSON and PNG textures); project, animation, terrain and settings JSON; Export portable project; images, video and ZIPs as listed in the other tables
World builderOpen editable world (JSON)Save editable world (gamebench-editable-world.json); Export .obj + .mtl (modular buildings); map and view PNGs; town map SVG; the terrain map project with heights, surfaces, roads, props and labels as JSON (.overpass.json)
Sprite lightingSource image; Open material project (.isbmaterial, .gbmaterial, Laigter .laigter and material-project .zip); Import preset (.isbpreset, .gbpreset, Laigter .preset, .presets, .txt)Export .isbmaterial; Export preset (.isbpreset); normal, height, specular, occlusion and parallax maps as PNG

Audio

EditorImportExport
Audio workshopImport audio: audio files the built-in decoder reads (such as WAV, MP3, OGG and FLAC), up to 50 MB each; ● Record from a microphone; Open project (.audio.json)Export audio / ↓ Download WAV (WAV); Save project (.audio.json, including imported audio); game delivery and event-bank ZIPs
Sound designerLoad settings (.json)Export WAV (16-bit mono, named after preset and seed); Save settings (sound-settings.json); game delivery and event-bank ZIPs
Parameter soundOpen sound: .isbsound, .gbsound, .json and legacy setup files .cpt (import only)Save sound / Export .isbsound; Export audio as WAV (8 or 16-bit, as set in the sound), FLAC, OGG or MP3; game delivery and event-bank ZIPs
Music & compositionImport sample / IR (audio files); Open composition (.music.json); Import MIDIExport WAV with Format wav16, wav24, ogg, flac or mp3; Save composition (.music.json); Export MIDI; Export synchronized stems ZIP; game delivery and event-bank ZIPs
Avatar stageWAV (Measure local PCM WAV, analysis only)—
RPG CreatorAudio files in Import resources (audio/bgm, bgs, me, se)Embedded in exported games
Textures & terrainSoundtrack for animationsSoundtrack inside Export MP4 + audio
  • OGG (Vorbis), FLAC and MP3 are produced by the bundled local encoder from a WAV under 256 MB. Encoding stops after 120 seconds.
  • Audio workshop's URL loader is disabled ("Import a file from your computer. External connections are disabled.").
  • Game delivery ZIPs (Export game WAV + recipe) and event banks (Export event bank ZIP) are described in Audio presets and delivery.

MIDI

FormatExtensionsImportExportNotes
Standard MIDI File.mid, .midiYesYesMusic & composition. Reads SMF types 0, 1 and 2 with PPQ or SMPTE timing, tempo and time-signature maps, programs, banks, controllers, pitch bend, pressure, lyrics, SysEx and unknown chunks. An unchanged import exports its original bytes exactly; edited exports keep the events the editor does not use. New compositions export as type 1 at 480 ticks per beat (composition.mid). Type-2 sequences can be selected separately (MCP).

Meshes and scenes

Formats & interchange

Use Import model + resources for a model and its images, materials and binary sidecars, or Import folder when relative paths matter. Open in 3D workspace sends the imported scene to 3D scene & animation. Export with Export locally → Format → Export files. See Formats & interchange.

FormatExtensionsImportExportNotes
glTF / GLB.gltf, .glb, .binYesYesGeometry, materials, hierarchy, skins, clips, cameras and lights, morph targets and weight animation, Draco-compressed meshes and point clouds, glTF points. Export GLB · embedded or glTF · embedded.
FBX.fbxYesYesASCII and binary import. Export FBX · mesh/rig/animation as ASCII 7.4 with UVs, normals, colors, diffuse materials and textures, hierarchy, skin clusters, cameras, lights and sampled TRS animation.
Collada.daeYesYesGeometry, materials, hierarchy, skin controllers and animations; export includes skeletal controllers and sampled animation.
OBJ + MTL.obj, .mtlYesYesGeometry, normals, UVs, vertex colors, materials and texture sidecars. Export is a static snapshot.
PLY.plyYesYesASCII and binary little/big endian meshes and point clouds with normals, colors and UVs (PLY/STL binary, PLY big endian).
STL.stlYesYesASCII and binary.
Scene JSON.jsonYesYesThe complete Isberg scene with retained source metadata (Save scene JSON). The safest format for keeping everything.
TMX / TSX, Isberg tiles, Crocotilesee TilesYesTMX, .isbtiles
Textures.png, .jpg, .jpegYesYes (sidecars)Missing textures produce diagnostics; nothing is fetched from URLs.

FBX, glTF/GLB and Collada exports embed a complete editable Isberg scene by default (Embedded editable scene); OBJ, PLY and STL write a .source.scene.json sidecar instead. Other programs read the standard data; Isberg Labs restores the full scene. Turn the option off for standards-only files.

Limits. This is scoped format support, not complete equivalence with every exporter or vendor extension. FBX export does not carry vendor constraints, NURBS or IK. glTF extensions outside the supported set are kept with a diagnostic. Static formats (OBJ, PLY, STL) have no bones or animation. The interchange preview draws at most 20,000 triangles; the full data is kept.

Other 3D editors

EditorImportExport
3D scene & animationImport: scene JSON, .isbtiles/.gbtiles, OBJ + MTL, glTF, GLB (with .bin, PNG and JPEG sidecars), TMX; Instantiate prefab and Open source scene (retargeting) read JSONSave (scene.scene3d.json); Export: GLB, glTF, OBJ + MTL, Collada, TMX (floor tiles only; other meshes are skipped with a notice), Viewport PNG; Save subtree (subtree.prefab.json); Frames ZIP; Record WebM
Tile modelerOpen (.isbtiles, .gbtiles, .json); Import image (atlas)Save (model.isbtiles); glTF; OBJ; PNG
Vertex painterOpen OBJ / JSON; Reimport source; Load snapshot file (JSON)Export OBJ (painted-mesh.obj); Export JSON (mesh or scene); Snapshot PNG; Save snapshot file (JSON)
Level & playtestOpen (.json, .level); Import .tscn (Godot text scene)Save level (.level.json); Export check report (.preflight.json)
Scene painter (MCP)Scene exports.json, .isbscene or .mesh through scene_painter_export

Shaders and scripts

EditorImportExport
Shader graphOpen graph (.json); Choose local texture (PNG, JPEG, WebP)Save graph (.shader-graph.json); Export shader (.gdshader)
Shader materialsOpen material/source (.json, .gdshader); Add local include (.gdshaderinc, .inc, .glsl); textures (PNG, JPEG, WebP)Save material (.shader.json); Export PNG (preview)
Script workspaceOpen source (.gd, .js, .mjs, .lua, .txt)Save source (scene-script.gd, .lua or .js, by language)
JavaScriptLoad project (.json); Add local assets (any files)Save source project (javascript-project.json); Save complete session (javascript-session.json); Export playable game
Pixel & animationPXL art scripts (.px.js); Lua scripts (.lua, .js in the scripts folder); Install local Lua extension… (.lua, .json, .zip, .aseprite-extension)Export assets… from PXL scripts
RPG CreatorPlugin sources in an imported projectPlugin sources in project ZIPs and games

Game-engine and reference-tool formats

FormatExtensionsImportExportWhere
Godot projectfolder, project.godot, ZIP, .pckYesYes (project files)Game runtime opens and edits projects and writes their scenes and resources (Save files). See Game runtime.
Godot text scene.tscnYesYesImport in Level & playtest; written inside native projects and the Textures & terrain Godot bundle.
Godot SpriteFrames.tres—YesPixel & animation sprite sheets.
Godot shader.gdshader, .gdshaderincYesYes (.gdshader)Shader materials (open), Shader graph (export), Textures & terrain bundle.
Engine PCK pack.pck, embedded in executablesYes—Game runtime; MCP archive_extract_pck.
Aseprite.ase, .asepriteYes—Pixel & animation; import only. Aseprite-style JSON sheet data is exported.
Earlier sprite documents.pforge, .gbspriteYes—Pixel & animation; saved as .isbsprite.
TexturePacker, Phaser 3, Unity sheet data.json—YesPixel & animation sprite sheets.
Tiled.tmx, .tsx, .tmjYesYesSee Tiles and tile maps.
Laigter.laigter, .preset, .presetsYes—Sprite lighting; import only.
Crocotile 3D.croco, .crocotile, .c3dpYes—Formats & interchange; import only.
PNGTuber Plus save.saveYes—Avatar stage Open rig, which also accepts .isbavatar, .gbavatar, .json and .avatar. Images referenced only by path are resolved with Resolve sprite PNGs.
Legacy parameter-sound setup.cptYes—Parameter sound; import only.
Compatible RPG project folderfolder with data, resource folders and optional js/plugins.jsYesYes (ZIP)RPG Creator Import RPG project and Export project ZIP. See RPG Creator.
PlayStation TIM.TIM—YesTextures & terrain Save .TIM (PS1 binary) and Download TIM batch ZIP.
Blender import script.py—YesInside the Textures & terrain Export Godot + Blender bundle.

Playable game exports

These produce complete games rather than asset files. See Exporting games for requirements and steps.

EditorTargets
Game runtime (native)Windows, macOS (app in a ZIP), Linux, Android (APK, or App Bundle + APK / APKS), iOS / iPadOS (Xcode project), and Windows with the integrated .NET runtime
Game runtime (web backend)Portable Windows game, Web game
JavaScriptPortable Windows game, Web game (optional Web portable launcher)
RPG CreatorExport playable HTML (single .html), Export Windows game, Export macOS game (Apple silicon or Intel ZIP), Export web folder
3D scene & animation, Level & playtestThrough ▶ Play into Game runtime, then its exports

Video and frame captures

FormatImportExportWhere and notes
Video files (.mp4, .webm, .mov, .mkv, .gif)Yes—Pixel & animation Load video… → Extract frames (start and end time, 1–30 fps, width 8–512 px, 2–256 colors, optional background and flicker removal). Textures & terrain + Import a video. Only files the built-in player can decode open.
WebM video—Yes3D scene & animation and Avatar stage Record WebM; Textures & terrain Export WebM video.
MP4 with audio—YesTextures & terrain Export MP4 + audio (bundled local encoder).
Animated GIFYesYesPixel & animation; Textures & terrain Export animated GIF.
PNG frame sequenceYesYes3D scene & animation Frames ZIP (PNG frames plus animation.json); Textures & terrain Export PNG sequence + timing ZIP; Pixel & animation PNG sequence.
Limits. 3D scene renders are limited to 1,800 frames or 60 seconds per export, and a frame ZIP to 256 MB.

Isberg documents

DocumentExtension (earlier names)ImportExportWhere
Workspace project.isberg (.gbench, .veldryne)YesYesHeader Open project / Save project.
Sprite.isbsprite (.gbsprite, .pforge)YesYesPixel & animation; keeps layers, frames, linked cels, palettes, tags, slices, groups, tile data and precision samples.
Tile project.isbtiles (.gbtiles)YesYesTile modeler, Formats & interchange, 3D scene (import).
RPG project.isbrpg (.gbrpg)YesYesRPG Creator Open, Save, Save RPG project.
Lighting project / preset.isbmaterial, .isbpreset (.gbmaterial, .gbpreset)YesYesSprite lighting.
Parameter sound.isbsound (.gbsound)YesYesParameter sound.
Avatar rig.isbavatar (.gbavatar)YesYesAvatar stage Open rig, Save rig / Export .isbavatar.
Tile clipboard.isbtileclip (.gbtileclip)YesYesMCP only.
Project bundle.isbundle (.gbundle)YesYesMCP only; see Bundles.
Scene painter document.isbscene (.gbscene)YesYesMCP scene painter tools.
Descriptive JSON documents.scene3d.json, .prefab.json, .level.json, .preflight.json, .music.json, .audio.json, .shader-graph.json, .shader.json, .game-preset.json, .tool-preset.json, javascript-project.json, javascript-session.json, gamebench-editable-world.jsonYesYesThe editors named in this chapter.

Archives

ArchiveImportExportWhere and notes
.isberg project containerYesYesSee What an .isberg file contains.
.isbundleYesYesMCP project_pack / project_unpack.
ZIP / ZIP64Yes—MCP archive_extract_zip: stored, Deflate and Zstandard, supplied ZipCrypto/AES passwords. Game runtime opens ZIP projects; Sprite lighting opens material-project ZIPs; Pixel & animation installs Lua extension ZIPs.
PCKYes—Game runtime and MCP archive_extract_pck.
RPG project ZIP—YesRPG Creator Export project ZIP (data, maps, resources, plugins, optional unused-resource filtering).
Audio ZIPs—Yesgame-audio-delivery.zip, style-sound-bank.zip, game-music-stems.zip.
3D frame ZIP—Yes3D scene & animation Frames ZIP (scene-animation-frames.zip).
Texture and terrain ZIPs—YesTextures & terrain: Download PNG batch ZIP, Download TIM batch ZIP, Download sprites ZIP, Download PNG + layout ZIP, Export OBJ + MTL + textures ZIP, Export material maps ZIP, Export baked maps ZIP, Export separate chunks ZIP, Export PNG sequence + timing ZIP, Export Godot + Blender bundle.
macOS game ZIP—YesGame runtime and RPG Creator macOS exports. Extract and sign on a Mac.

MCP tools

Compatibility limits

This chapter collects what Isberg Labs does not do, what has not been verified, and what each export platform needs. Isberg Labs reads and writes many formats used by other tools and follows several reference behaviors, but exact one-to-one equivalence with any other application, across every version, setting, gesture, file variant or device, is not certified.

What is and isn't certified

Verified by the release checks:

  • The packaged application starts and runs its MCP server, codecs, scripts, JavaScript engine, format tools, game export and viewport capture with the system PATH emptied, using only bundled components.
  • Packaged desktop workflows: editing, undo, saving, reopening, layout changes and restoring after a failed open.
  • Exported Windows games start in separate processes, render, and keep saves across launches.
  • The native engine compiles and runs C# and C extensions, runs compute and fog on the bundled software Vulkan renderer, stops at debugger breakpoints and exports games without the source project.
  • Large ZIP64 archives, encrypted ZIP and PCK files, and project archive cancellation and rollback.
  • Mobile and desktop export artifacts are inspected for signatures, libraries, Lua scripts and alignment.

Not certified:

  • Exact equivalence with any reference application (for example Aseprite, Godot, Tiled, Crocotile 3D or RPG Maker MZ). Reference executables were not run for comparison; comparisons use published sources, formats and captured samples.
  • Every format variant, codec, container or vendor extension within a supported format family.
  • Every GPU and driver, a pristine Windows installation, Windows signing policies and every crash path.
  • Running exported games on macOS, Linux, Android or iOS devices (only the artifacts are checked; see Game export by platform).
  • Hardware timing: microphone and stylus latency, operating-system audio capture.

A tool's presence in the MCP registry does not prove that every gesture of the original editor is reproduced.

Platform and portability

  • The Isberg Labs desktop application and MCP server run on Windows x64 only. Other platforms are export targets, not host platforms.
  • Keep the portable folder together. A missing bundled engine or codec is reported; Isberg Labs never installs another tool as a fallback.
  • License activation and periodic validation need the internet; the license keeps working offline for 14 days after the last successful validation. See License.
  • Native project code (GDScript, C#, C/C++ extensions) and authored game code are trusted local code. They are not confined by an operating-system sandbox, and the JavaScript virtual machine is not a security boundary.

Workspace, projects and shared assets

  • Documents convert between editors only through the named adapters that asset_document_adapters lists. Arbitrary conversion between unrelated document types is not provided.
  • Converting a native engine project's arbitrary nodes back into the simpler level format is not lossless.
  • Native editor gestures keep their own native undo history; synchronized project snapshots enter the shared history.
  • Seam synthesis, tracing and image-derived material maps in the retained texture tools are algorithmic approximations. Source-specific exports and unusual document and codec combinations are not all covered.

Pixel art, color and image formats

  • .ase, .aseprite and .pforge files are import-only. Editable sprites save as .isbsprite.
  • Indexed PNG export keeps the palette, duplicate and unused slots and exact pixel indices, but re-encodes a noninterlaced PNG. The original sample packing, filters and compressed layout are not preserved. Ambiguous composites and incompatible sheet palettes are rejected instead of guessed.
  • Non-indexed PNG and APNG use the general image codecs; native APNG indices and unrelated PNG ancillary chunks are not kept. cHRM data is kept, but custom primaries are not transformed.
  • 16-bit and float precision: the display remains an 8-bit preview. APNG16 and 16-bit sheet export, arbitrary ICC lookup tables, compressed, tiled, multipart or wide-gamut OpenEXR, and HDR monitor output are not supported. Older brushes, filters and geometry operations are not all precision-aware; they reject precise documents instead of reducing them.
  • EXIF geometry and thumbnail regeneration, and semantic editing of every ancillary extension, are incomplete.
  • Exhaustive native tool, ink and gesture behavior, every indexed brush and effect path, and pixel-for-pixel or byte-for-byte equivalence with the reference editor are not certified.
  • Aseprite-style batch: nested sub-tag playback, the interactive shell, Steam integration and the reference debug-log mode are not available. Custom extension dithering matrices, the octree palette matcher and the automatic palette optimizer are not reproduced. Exact packing coordinates and output bytes are not verified. Numbered image sequences stop at the first gap and at 2,048 frames.

Lua scripting and extensions

  • The Pixel editor's Lua host implements a partial, explicitly listed API and reports app.apiVersion as 0. Complete reference API parity is not claimed; pixel_lua_capabilities lists what exists.
  • Incomplete: one-shot and headless Timer, Events and modeless dialogs; anonymous and alternate-alignment tabs; some GraphicsContext rendering options; Window, Sprite and before-command events; Editor askPoint and cancel; custom file-format callbacks; the remaining commands; non-script extension contributions; indexed drawImage, tilemap images, image file input and output, and cross-plugin calls.
  • Scripts have no arbitrary network, process or file-system access.

Tile models, 3D scenes and painting

  • The Tile modeler's simple tile view uses affine texture projection; the scene view has the advanced renderer.
  • Original gesture and shortcut identity, and acceptance of files by the original tile-modeling application, are unverified. Reference project formats are import-only; editable output is .isbtiles.
  • Native skeleton save conventions have static evidence only; no native skeletal file has been certified against the original application.
  • Scene limits: 250,000 vertices per mesh, 256 bones per skin, four influences per vertex, 10,000 scene objects and 256 hierarchy levels.
  • The software viewport uses simplified shading; WebGL is the main 3D preview.
  • Rigging solvers have representation limits with extreme sheared or nonuniform hierarchies. External prefab constraint targets are kept as unresolved data rather than discarded.
  • Scene painting: normal painting through the inverse deformation of a posed mesh, and rendering arbitrary native shaders, are not supported.

Interchange formats

  • Supported families: glTF and GLB with skins, clips and morphs, FBX and Collada import and export, Draco, PLY, STL, OBJ with MTL, finite and infinite TMX in all projections with multi-atlas TSX and Zstandard compression, ZIP64 and PCK v1 to v3.
  • Supporting a format family does not mean every vendor-specific variant opens. Unsupported required extensions and proprietary variants are reported as diagnostics.
  • Collada export has structural tests but has not been tried in every external importer.
  • Arbitrary conversion of 3D scenes to TMX is not provided.
  • Static formats report animation they cannot store. OBJ mesh export cannot keep selection masks or editor snapshots.

interchange_capabilities lists the exact import and export domains and known unsupported features. See Formats & interchange.

Game runtime, GDScript and C#

  • The Web Compatibility profile has its own limits and reports unsupported modes. Native volumetric fog needs the Forward+ renderer, which that profile does not have.
  • Platform exports use the bundled Godot 4.5.2 export editor and templates, while the integrated editor and runtime are a newer custom 4.7.2 build. Features introduced after 4.5.2 may need a matching newer export engine. A newer editor version marker in a project produces a compatibility warning.
  • C# exports only through Windows · integrated .NET runtime; cross-platform C# export is rejected because the standard templates are not .NET templates.
  • Third-party GDExtensions need binaries for every target platform and architecture. A Windows DLL cannot stand in for a Linux, Android or Apple library. General iOS C++ or system-library code needs an Apple SDK.
  • Lua is supported through the bundled Lua GDExtension 0.7.0 with Lua 5.4.7; it does not add unrelated Lua framework APIs.

JavaScript

  • Checkpoints reconstruct a session by verified replay of recorded operations, not by dumping the V8 heap. Divergence fails explicitly, and unsupported native garbage-collector or task state refuses an exact checkpoint.
  • v8_snapshot saves explicit JSON state only, not closures, Promise continuations or timer callbacks.
  • Standard Node host modules are not available inside game scripts, and scripts get no host file-system, network or process API.

Shaders

  • Source checks (shader_validate) do not prove that a shader compiles on the GPU; shader_compile and shader_preview do the actual compilation.
  • Each preview identifies its backend. The Web Compatibility profile reports modes it cannot run.
  • Only the documented source subsets are supported; unsupported classes and passes are reported as diagnostics.

Audio, music and avatars

  • Transient quality, arbitrary malformed MIDI files, every codec and container, and unlimited duration are not certified.
  • WAV inputs for audio_render must be mono or stereo, 16/24/32-bit PCM or float32, 8 to 96 kHz, under 96 MB and 180 seconds.
  • Parameter sound matches a finite set of captured reference cases; that does not cover every possible setting, random state or historical version.
  • Avatar stage: physical microphone and operating-system capture latency, the original application's random state and exhaustive hardware behavior are unverified.

Materials and textures

  • The calibrated material profile follows published source definitions. Equivalence with the original executable and extreme platform rounding are unverified; the reference executable was not run.
  • Terrain baking keeps the retained tool's highest-X/Z rule.

RPG Creator

  • RPG Creator implements documented project structures and tested workflows. It does not guarantee that every imported project, plugin or rendering extension behaves as in the original engine. Preserved records can exceed what is simulated; missing resources and unsupported commands appear in diagnostics.
  • Plugin compatibility is tested with a finite set of unmodified open-source plugins. Arbitrary third-party scripts can depend on untested APIs, private internals, exact rendering constants or timing.
  • Time-progress battle formulas are compatibility assumptions for imported projects.
  • macOS game archives are checked for both architectures, but running them on a Mac is unverified.
  • Playtests through MCP (rpg_playtest) run without plugins; plugins run in the desktop playtest and exported games.
  • Third-party stock artwork is not supplied.

See RPG Creator.

Game export by platform

Export from Game runtime (or native_export) into an empty folder. The Studio itself runs on Windows; these are the targets it builds.

TargetOutputRequirementsVerified
Windowsx86_64 executable and game dataNone for the baseline GDScript, GDExtension and Lua projectExported games launched and saved
Linuxx86_64 executable and game dataLinux x86_64 with glibc 2.34 or laterArtifact only; not run on Linux
macOSUniversal Intel and Apple Silicon app in a ZIP, ad-hoc signedmacOS 15.0 or later; Developer ID signing and notarization for trusted distributionArtifact only; not run on a Mac
AndroidARM64 APK, or signed AAB with universal APK and APKS (debug build by default)Android 7.0 (API 24) or later for the bundled Lua runtime. JDK 17, SDK tools and bundletool are bundled; release builds need your own keystore. App Bundles default to target API 36.Signatures, target API, 16 KiB alignment and payloads checked; not run on a device
iOS / iPadOSComplete Xcode project with static Lua and C librariesApple team ID; a Mac with Xcode, signing and provisioning to build the app; ARM64 devices with iOS 12 or later (no Simulator)Project contents checked; not compiled, signed or run
Limits. The iOS export is an Xcode project, not a signed IPA; readiness reports it as not IPA-ready. Android export packages the precompiled template as a single base module: it does not compile custom Java or Android plugins, Gradle projects, Play Asset Delivery packs or dynamic feature modules. Google Play submission, developer verification, key enrollment and store policy checks are up to you, and meeting the target API requirement does not guarantee store acceptance. Source-project export presets contain absolute template paths; regenerate them after moving the Studio or the project.

See Game export for the export controls.

MCP automation

  • The live tool schemas define exact fields and limits; a tool's existence does not prove that every original editor gesture is reproduced.
  • Desktop automation goes through named controls, state adapters and canvas events. Some editors have no state adapter and must be saved through their own project controls.
  • Each desktop request is limited to 30 seconds and 16 MB; use the job tools for long work.
  • Jobs and sessions are lost when the server or client restarts.

See MCP server guide.

Troubleshooting & FAQ

Fixes for the problems people hit most often, and answers to common questions. Editor-specific problems are in the Troubleshooting topic at the end of each editor chapter; license messages are explained in License messages.

The studio does not start

  • Started from inside the ZIP. Windows can open an .exe directly from a ZIP, but then the files next to it are missing. Extract the whole ZIP first and run Isberg Labs.exe from the extracted folder.
  • Files missing or quarantined. If antivirus software removed or blocked a file, the studio cannot start. Restore the file or extract the ZIP again, and allow the Isberg Labs folder in your antivirus settings. Check the ZIP against its SHA-256 checksum (Download and verify).
  • Folder not writable. The studio writes its Data folder next to the executable. Do not run it from C:\Program Files, a read-only drive or a synced folder that locks files; move the folder somewhere you own.
  • Nothing seems to happen. Isberg Labs runs once per PC. If it is already open (possibly minimized or on another monitor), starting it again brings that window forward instead of opening a second one. If only the license window is open, finish activation there first.
  • The license window opens every time. This device has no valid activation. Follow the message in the window; see License messages.

License and trial problems

  • Could not reach the license server. Check that your firewall or proxy allows HTTPS to license.isberglabs.com. You can keep working for 14 days after the last successful check.
  • Already active on another device. Deactivate the old device from the list in the license window, then activate. See If the old PC is gone.
  • Clock message. Set Windows to set the time automatically, then choose Retry online.
  • Lost key. Search your email for the message sent after purchase. If you cannot find it, email [email protected].
  • MCP says the license is required. The MCP server shares the studio's activation. Activate in the studio or run MCP.cmd --license activate <key>; a running server notices within about 30 seconds.

Projects, saving and recovery

  • I lost unsaved work after a crash or a forced close. Start Isberg Labs and press Restore recovery in the header. It opens the previous session's copy (Data\recovery\workspace.previous.isberg), which is kept at start and replaced only at the next start. You can also open that file with Open project. See Automatic recovery.
  • "The previous workspace could not be restored. Open a project before replacing its recovery copy." The recovery copy could not be opened, so the studio protects it instead of overwriting it with an empty workspace. Open a saved project (or start a new one); the recovery copy is replaced only after that. To inspect the protected copy, make a copy of Data\recovery\workspace.isberg first and open the copy with Open project.
  • Old files. Files with the earlier names (.gbench, .gbsprite, .gbrpg and the other .gb* names) open unchanged, and you can save them again under the new Isberg extension; the content is the same.
  • Canceling an open. Canceling while a project opens leaves the current workspace as it was.
  • Where is my work? Projects are wherever you saved the .isberg file. Projects\ in the portable folder is only a suggested location. Each editor can also save its own document (for example .isbsprite) or add it to the project's assets.

See Projects, assets & history for how saving, recovery and shared Undo work.

Graphics, previews and playtests

  • 3D views, shader previews or playtests are blank or slow. Update your graphics driver. On PCs without a usable GPU the bundled software Vulkan driver is used, which works but is much slower.
  • A playtest or runtime session stopped after moving an editor to another monitor. Runtime sessions stop when an editor window is transferred. Choose Edit project or Run again. See The workspace.
  • The window layout is off-screen. Use the Windows list or Gather to bring editors back, or switch the layout from Floating windows to Universal workspace.

MCP client cannot connect

  • The paths in mcp-config.json are absolute. Start Isberg Labs.exe once after extracting or moving the folder so it writes the real paths, then copy the entry into your client again (or update command, args and GAMEBENCH_WORKSPACE there yourself).
  • Keep ELECTRON_RUN_AS_NODE set to 1 in the server's environment; without it, Isberg Labs.exe starts the desktop app instead of the server.
  • A configuration that still names Gamebench Studio.exe must be changed to Isberg Labs.exe. The server id gamebench is unchanged.
  • Run MCP.cmd --license status in the portable folder to confirm the license is active for MCP.

See MCP server guide.

Resetting preferences

The portable Data folder holds preferences, window positions, local storage, caches, saved scripts and palettes, and the recovery copy. To start fresh:

  1. Save your work and close Isberg Labs.
  2. Rename Data to Data-old.
  3. Start Isberg Labs. A new Data folder is created. Activate your key again; on the same PC this reuses the PC's existing slot.
  4. Copy anything you want back from Data-old (for example scripts, palettes or styles), then delete it.

Frequently asked questions

Does Isberg Labs need the internet?
Only for the license: starting the trial, activating, and a check about once a day. You can work offline for up to 14 days after the last check. Everything else runs locally.
Can I use it on my laptop and my desktop?
One device at a time. Deactivate one before activating the other. See Devices and moving your license.
Does it run on macOS or Linux?
The studio runs on Windows x64. It exports games for macOS, Linux, Android, iOS/iPadOS and the Web.
Do I need to install an engine, Node.js, a JDK or an SDK?
No. Everything needed to edit and export is in the portable folder. Only building an iOS app needs a Mac with Xcode.
Does it include AI features?
No. There is no generative AI, model or inference runtime. You can connect your own MCP client if you want an assistant to operate the editors.
Can I open my Godot, Aseprite, Tiled or RPG projects?
Many of their file formats import and export; see File formats reference and Compatibility limits for what is and is not supported.
Will my old Gamebench Studio projects open?
Yes. .gbench and every .gb* document open unchanged.
What happens when my trial ends?
The studio asks for a license key at the next start. Your projects are not changed, and they open again once you activate a license.
What if the license server is down?
Nothing stops. The studio keeps working on its last check for up to 14 days and retries automatically.

Release history

Changes in each release, newest first. Releases before 0.20.0 were named Gamebench Studio; their .gbench and .gb* files still open in Isberg Labs. Dates come from the release manifests where they record one.

0.21.0 (2026-11-04)

The first licensed build. The editors and the 375 MCP tools are the same as in 0.20.0.

  • License. Isberg Labs is sold as one lifetime license, activated on one device at a time and validated online.
  • Free trial. Start 14-day free trial gives this computer every feature for 14 days without a key, one trial per computer.
  • License window. On first start only the license window opens. It shows the license status, this device, the license key field, Activate, Start 14-day free trial, Buy a license, Validate now, Deactivate this device and the activated devices. After activation, Open Isberg Labs opens the workspace. The License button in the sidebar reopens it and shows the trial days left or a warning when online validation is needed.
  • Offline grace. The license revalidates about once a day when online and keeps working offline for 14 days after the last successful validation; the sidebar warns from day 10. A license that lapses while you work only warns; the lock applies at the next start.
  • MCP. Every MCP tool needs this device's activated license; unlicensed calls return a "license required" error. New MCP.cmd --license commands: activate <key>, status, devices, deactivate [deviceId] and trial. See License commands.
  • Only license activation and validation use the network; project work stays local.

See License.

0.20.0 (2026-11-03)

Gamebench Studio became Isberg Labs. All twenty editors, the 375 MCP tools and the 0.19.1 fixes are unchanged.

  • New name in window titles, the studio header, menus, dialogs, file-type labels, MCP tool descriptions, CLI help, documentation and the portable folder.
  • New logo and iceberg icon for studio windows, the taskbar and the executable, whose version details now read Isberg Labs.
  • The portable folder contains Isberg Labs.exe and Start Isberg Labs.cmd; MCP.cmd and mcp-config.json point at the new executable.
  • New file extensions: projects .isberg (was .gbench), sprites .isbsprite, tile models .isbtiles, RPG projects .isbrpg, material projects .isbmaterial, material presets .isbpreset, sounds .isbsound, avatar rigs .isbavatar, tile clipboards .isbtileclip, project bundles .isbundle and painter scenes .isbscene. The recovery copy uses .isberg.
  • Files with the earlier extensions open unchanged everywhere and can be saved again under the new extension. Format identifiers inside files, GAMEBENCH_* environment variables and the gamebench MCP server id are unchanged; MCP client configurations only need the new executable path.
  • Windows games exported from the portable release reuse its desktop runtime, so their executable shows the Isberg Labs icon and version details under the game's own file name.

0.19.1 (2026-11-03)

A fix release; all editors and MCP tools are otherwise unchanged.

  • Windows game export from the portable release. v8_export_game (target windows, and the web export's offline launcher) and runtime_export (format windows) failed because the portable desktop runtime was not found. They now reuse the application's own desktop runtime, copying only the runtime files.
  • Exported asset types. JavaScript game exports write assets with real file extensions (.png, .wav, .ogg and others), so players and static web hosts serve the right content type.
  • Window size and title. Exported JavaScript games for Windows open with the exported title and size the game area to the requested width and height instead of a fixed 1280 × 720 outer window. Full-engine Windows exports also size the game area.
  • Model inspection. interchange_info now inspects .glb, .gltf, .fbx, .dae, .obj, .ply, .stl and .tmx files directly. The other scene tools now say that a raw model must be imported with interchange_import first.
  • Privacy. Exported JavaScript games no longer include the author's time zone.

Re-export games to pick up these fixes.

0.19.0 (2026-11-01)

A maintenance release of the complete Windows x64 portable suite, with all twenty editors and 375 MCP tools.

  • Concurrent project saves to filenames that differ only in letter case now commit in order, so older edits cannot overwrite newer ones.
  • Cancelled project opens are rejected consistently for legacy documents, small archives and late cancellation.
  • Malformed RPG saves are validated before they replace the active session, so the current game and map survive a failed load.
  • Desktop self-tests use temporary profiles and never touch your preferences or recovery data.
  • Packaging requires a fresh destination, so old runtime files or existing Data and Projects folders cannot leak into a release.
  • Source, application and MCP registry versions are aligned.

Keep your previous release until your projects open in the new one. To keep settings and recovery, close both versions and copy the old Data folder into the new portable folder.

0.18.0 (2026-11-01)

  • RPG Creator connects display timing, screen and zoom hooks and live map tile rendering to plugin methods.
  • The exported game loop advances input, simulation and frame counts at the game clock: the same elapsed second produces 60 logical updates at 30, 60, 120 or 144 Hz displays, and redraws alone do not advance the game.
  • Screen updates govern tint, picture motion and zoom; paused progress is kept in saves.
  • The unmodified MIT-licensed plugin examples grow to nine.

0.17.0 (2026-11-01)

  • RPG Creator connects enemy AI condition, rating and action-list hooks, saved forced-action scheduling, and map, character and interpreter update hooks to actual gameplay.
  • Saved enemy decisions do not reroll after loading; forced actions queue behind the current action and its presentation.
  • The unmodified MIT-licensed plugin examples grow to seven.

0.16.0 (2026-11-01)

  • Exact 16-bit (uint16) and linear float32 cel storage with numeric editing, undo and redo, and project persistence. Open it from Sprite → Precision — 16-bit / HDR… in the Pixel editor.
  • 16-bit PNG and APNG import, PNG16 export, supported color transforms, bounded HALF/FLOAT OpenEXR import and FLOAT32 export.
  • Lua: frame-specific palettes, named dialog tabs, shade picking, native file-path selection, bounded Canvas2D drawing with mouse and key callbacks, and explicit precision methods.
  • Two MCP tools for precision work (pixel_precision, pixel_precision_export), bringing the registry to 375 tools. Operations that only handle 8-bit data reject precise documents instead of reducing them.
  • RPG Creator adds shared parameter, metadata and command helpers, death and revival and event movement override dispatch, saved plugin action classes, mutable queued action lists and event page lifecycle hooks. Five unmodified MIT-licensed plugins are included as optional examples.

0.15.0 (2026-11-01)

  • Android App Bundle export: a signed AAB with a matching universal APK and APK set, local release-key creation and editable version code and name. Three MCP tools were added: mobile_export_info, android_signing_key_create and android_bundle_build.
  • RPG Creator adds live battle, damage, effect and reward plugin hooks, independent actor copies, child interpreter waits, native Tilemap and PIXI ticker behavior, scene callbacks and animation-gated turn and time-progress actions. Two unmodified MIT-licensed plugins are included as optional examples.

0.14.0 (2026-11-01)

  • Android export bundles a portable JDK 17 and Android SDK build and platform tools for direct signed APK export, with a stable local debug signing key. Nothing is installed globally.
  • RPG Creator adds interpolated followers and vehicles, event alias dispatch, message paging and scrolling, quantity-based shops, imported character component layers, decoded looping audio, movie waits, distortion rendering and offline macOS packaging. Plugin save classes persist across reloads.

0.13.0 (2026-11-01)

  • A combined release with RPG Creator, verified Lua platform exports and persistent detached editor windows. The studio remembers each detached window's monitor, position, size and minimized or maximized state and reopens them with the recovered project.
  • RPG Creator adds real PIXI scene, window and sprite APIs, menu and battle windows, expanded battle traits and queued actions, cell-based animation and offline Effekseer playback. Every playtest uses the isolated full player, and save slots persist with the project. The Harbor demo gains a plugin journal, a side-view actor and a particle effect.

0.12.0

  • Native exports check the delivered Lua scripts, registration and dependencies in each platform artifact.
  • iOS export generates a complete Xcode project locally, with static Lua and C libraries.
  • The RPG editor is named RPG Creator, with its own starter adventure, blank projects and .gbrpg documents.

0.11.0

  • Editors can move to other monitors: drag an editor title bar outside the app, or click ↗. Return to workspace, the window's close button or Gather brings them back with their current documents. Detached editors share project saving and Undo/Redo.
  • A compatibility update adds exact indexed PNG and palette-index editing, local color-profile display and conversion, full-resolution reference images, external tileset embedding, typed sprite metadata, local Lua extensions with modeless dialogs, native indexed and tile clipboard operations, action, UV, choreography and weight-curve controls, named curve forms, and scene painter MCP tools.

0.10.0

  • The RPG editor adds imported autotile graphics, resource management, an isolated plugin host, active and wait time-progress battles, troop events, routes and vehicles, and offline Windows game export. The Harbor demo shows the new workflow.

0.9.0

  • Lua 5.4 and its native GDExtension are bundled by default. Lua scene callbacks run in native playtests and exported games without installing Lua or a plugin; each export includes its target runtime libraries.

0.8.0

  • Twenty editors, including an RPG editor with an editable starter adventure, blank projects and .gbrpg documents.
  • New native projects enable GDExtension (Best for Performance) by default, with editable C source, a local ABI header and a bundled compiler.
  • Game runtime adds direct Windows, macOS, Linux, Android and iOS/iPadOS export choices with built-in templates, project presets and readiness checks. At this point Android export still needed a separately installed JDK and Android SDK.
  • Lua scene scripting in the Script workspace. Native exports kept Lua source but needed a compatible Lua extension to run it (bundled from 0.9.0).
  • Game presets for ten game types in nineteen editors, with editable settings, seeded generation, shared Undo/Redo and portable recipes.

0.7.0

  • Floating workspace: editors, the Tools palette and the shared inspector, asset, file, animation and output windows float. Drag title bars to move and overlap them, drag edges or corners to resize, and minimize and restore from the taskbar or the Windows list. Layouts persist in preferences and projects.

0.6.0

  • The classic workstation interface: gray beveled controls, striped title bars, compact colored tool icons and a blue desktop, applied to the embedded tools, nested map editors, dialogs and the native project editor.

0.5.0

  • Game runtime defaults to the bundled Windows native engine, embedded in the workspace, with local GDScript, C#, C and C++ extensions, Forward+ Vulkan rendering with compute and fog, a local debugger and portable native game export. The Web Compatibility editor and player remain available.
  • Full JavaScript sessions with checkpoints and playable JavaScript exports.
  • New MCP families for the full engine (runtime_*, native_*) and JavaScript (v8_*); the registry had 323 tools.

0.4.0

  • Nineteen editors with persistent native 2D and 3D project editing, full GDScript and JavaScript execution, and standalone playable game export.
  • Level & playtest gains a full-engine playtest: the shared Play button converts the level, its geometry, materials and scripts into a native project. Edit project in Game runtime opens full native 2D, 3D, resource, script and animation authoring with Windows and Web exports.
  • 3D: native tile animation, choreography, cameras and directional UVs, IK, constraints, retargeting, morph evaluation, modeling brushes and visual shader graphs.
  • Compatible scene, level and mesh documents transfer between editors as editable assets with shared undo.

0.3.0

  • One project workspace with dockable editors, a scene tree, a shared inspector, assets, a file browser and animation and output docks. Universal workspace, Quad view and Split layouts; drag tabs between docks and double-click a tab to maximize its dock.
  • Level projects can import supported local script and shader source; the desktop playtest and level_playtest run attached scripts. The Script workspace adds source analysis, stepping, input, timers and signals.
  • Projects save as .gbench with their authored assets embedded. The MCP server ships in the portable folder.

0.2.0 (2026-10-31)

  • The earliest recorded portable build: twelve creative editors, a bundled runtime and 190 MCP tools.

License

Isberg Labs is sold as one lifetime license. You activate it on one device at a time, and it is validated online. A 14-day free trial gives a computer every feature before you buy. This chapter covers buying, the trial, activation, moving between PCs, offline use, every license message, and what the license check sends.

License at a glance

TypeLifetime. You pay once; the license has no expiry date and no subscription.
PriceCA$50 (about US$36), one-time. Stripe shows the final amount before you pay.
DevicesOne device at a time. To use it on a different PC, deactivate the old one and activate the new one.
ValidationOnline. The studio checks the license at activation and then about once every 24 hours.
Offline useUp to 14 days after the last successful online check. Warnings start when 4 days remain.
CoversEvery editor, export target, MCP tool and command-line tool. The studio, every MCP.cmd server and the command-line tools on the same PC share one activation.
UpdatesBuy once and keep every update in this release line.
Support[email protected]
Free trial14 days, every feature, no key needed, one trial per computer.
Your workProjects, editors, exports and MCP work stay on your computer. Only activation and validation contact the license server.

Free trial

The trial gives this computer every feature, in the studio and through MCP, for 14 days. It needs an internet connection to start.

  1. Start Isberg Labs.exe. The license window opens.
  2. Choose Start 14-day free trial. The window shows Preparing your free trial… this takes a few seconds. while the computer solves a short one-time check.
  3. When it shows Your 14-day free trial has started., choose Open Isberg Labs.

During the trial:

  • The sidebar's license button reads Trial: N days left. It turns into a warning (⚠, amber) when 3 or fewer days remain.
  • The license window shows Free trial — N days left, the Trial ends date, and an Upgrade to a license box with the key field and Buy a license. Enter a key there at any time; the trial is replaced by your license.
  • The trial end date is part of the signed license data, so it applies offline too. Moving the clock back does not extend it.

When the trial ends, the next start shows Free trial ended and the message Your 14-day free trial has ended. Enter a license key to keep using Isberg Labs; your projects are untouched. Your .isberg files and exports are not changed or locked; open them again after you activate a license.

One trial per computer

  • Asking again, reinstalling Isberg Labs or deleting the Data folder returns the same trial with the same end date.
  • Reinstalling Windows does not start a new trial: the computer's hardware ID is recognised and the request is refused with This computer has already used its free trial.
  • A trial is bound to the computer that requested it. Copying a trial to another PC gives This trial key belongs to another computer. Start your own free trial or enter a license key.
  • Requests are rate-limited per network. If you see Too many trial requests from this network or Too many trials are being started right now, try again later.

Buying a license

  1. Choose Buy a license in the license window, or choose Buy a license in the Download section of isberglabs.com.
  2. Pay on the Stripe checkout page. To buy several licenses at once, set the quantity; you get one key per license.
  3. Stripe returns you to the thank-you page, which shows your key (with a Copy button) and the activation steps. The key is also emailed to the address you gave at checkout.
  4. Activate the key as described below.
  • The thank-you page shows keys for 72 hours after checkout. After that, your email is your copy of the key. Keep it somewhere safe.
  • Some payment methods (for example bank transfers or SEPA debits) take days to clear. The page then says Your payment is still being confirmed, and the key is emailed as soon as the payment clears.
  • If the email is late, the thank-you page still shows the key. Reloading the page or a delayed confirmation never creates a second charge or a duplicate key.
  • For help with an order or a license, including a missing key or a refund request, email [email protected]. A refunded or disputed license is suspended and stops validating.

Activating a license

  1. Start Isberg Labs. The license window opens on first start; later, choose ⚿ License at the bottom of the sidebar.
  2. Paste your key into License key (under Activate this device, or Upgrade to a license during a trial).
  3. Choose Activate. The status changes to Active on this device and the window shows This device is activated.
  4. Choose Open Isberg Labs.

Activation needs an internet connection. If the key is already active on another device, see Devices and moving your license. To activate without opening the studio, use MCP.cmd --license activate <key> (see License commands).

The license window

The Isberg Labs license window is a small tool window in the classic style. It opens by itself when this device has no valid license or trial, and from the sidebar's license button at any time. The header shows One lifetime license · 1 device, plus the trial offer when one is available.

License status

A colored lamp and a status line summarise the state:

Status lineLampMeaning
Checking license…—The saved license is being read or checked.
Active on this deviceGreenLicensed and recently validated.
Active — validate online within N day(s)AmberLicensed, but the offline grace is running out. Connect and choose Validate now.
Free trial — N days leftGreen, amber in the last 3 daysA trial is active.
Not activatedAmberNo trial or license on this device yet.
Free trial endedRedThe trial is over. Enter a license key.
License requiredRedAny other problem. The message below the status says what happened; see License messages.

When a key is saved, a details list shows:

This device
This computer's name, as it appears in the device list.
License key
The key in use.
Last validated
When the license server last confirmed the license.
Works offline until
The end of the offline grace (14 days after the last validation; for a trial, the earlier of that and the trial end).
Trial ends
Shown during a trial only.

Buttons

ButtonWhat it does
Open Isberg LabsOpens the workspace (shown when licensed or in a trial).
Validate nowChecks the license online immediately, skipping any retry wait.
Deactivate this deviceFrees this device's slot and removes the saved activation. Open work stays open; the key is needed at the next start. Not shown during a trial.
Retry onlineShown when a saved license could not be confirmed. Tries the server again immediately.
ActivateActivates the key typed in License key on this device.
Start 14-day free trialStarts the trial (No key needed · every feature · one trial per computer). Hidden once this computer has used its trial.
Buy a licenseOpens the store page in your browser.
Deactivate (in Activated devices)Frees the slot of the listed device, after a confirmation.

The status bar at the bottom reads Only activation and validation contact the license server · projects stay on this computer. After a failed check it shows when the next automatic attempt is due.

The sidebar license button

At the bottom of the workspace sidebar, the license button shows the state at a glance and opens the license window when clicked:

  • ⚿ License: licensed, nothing to do.
  • ⚠ License: validate online (amber): the offline grace is running out, or the license needs attention. Hover it to read the message.
  • Trial: N days left: a trial is active (amber in the last 3 days).

Devices and moving your license

A license is active on one device at a time. A device is one Windows installation on one PC. The device list names it by the computer's name.

Moving to a new PC

  1. On the old PC, open License and choose Deactivate this device, then confirm.
  2. On the new PC, start Isberg Labs, paste the key and choose Activate.

If the old PC is gone, broken or reinstalled

  1. On the new PC (or the reinstalled Windows), paste the key and choose Activate.
  2. The window says This license is already active on another device. Deactivate that device (for example a replaced PC), then activate this one. and lists the activated devices under Activated devices, each with its name, platform and activation date.
  3. Choose Deactivate next to the old device and confirm. The window says the device was deactivated and one slot is free.
  4. Choose Activate again.

When Isberg Labs on a deactivated device next checks in, it shows This device is no longer activated for your license. and asks for the key. Work that is open at that moment is not closed.

Note. The activation belongs to the PC, not the folder. Moving the portable folder to another drive on the same PC keeps it active, and activating the same key again on the same PC (for example after deleting the Data folder, or in a second copy of the portable folder) reuses this PC's slot. Copying Data\license.json to another PC does not move the license: that PC shows The saved license belongs to another device. and must activate.

Working offline

  • When online, the studio revalidates about once every 24 hours. Each device's daily check is spread over a window of up to 2 hours, and starting the studio or MCP reuses the saved check until a new one is due.
  • Offline, Isberg Labs keeps working for 14 days after the last successful validation. When 4 days or fewer remain, the status reads Active — validate online within N day(s) and the sidebar shows ⚠ License: validate online.
  • After 14 days without a successful check, the next start opens the license window with The license has not been validated online for more than 14 days. Connect to the internet and retry. Connect, then choose Retry online.
  • If the server is unreachable or busy, failed automatic checks are retried with a growing wait, from 5 minutes up to 6 hours. A busy or overloaded server never locks you out before your 14 days run out. Retry online and Validate now skip the wait.
  • The grace period is measured from the license server's signed time, not your PC's clock. Moving the clock back more than one hour before the last check locks the license until the next online check (The system clock is earlier than the last license check.).
Tip. A license problem never closes open work. If the license lapses while the studio is running, you see a warning and can keep working and save; the lock applies at the next start.

License commands (MCP and command line)

Every MCP tool and command-line tool (gamebench.js, aseprite-compat.mjs, pxl.js) needs this device's activated license or trial, shared with the desktop studio. The command-line tools print Isberg Labs license required: … and exit with code 1 without one; their --help and --version output still works. A tool called without one returns an error that begins Isberg Labs license required: followed by the reason and the hint Activate this device in the studio or run MCP.cmd --license activate <key>. The MCP server rechecks about hourly while licensed and every 30 seconds while not, so activating in the studio unblocks a running MCP server.

You can manage the license without the studio. Open a command prompt in the portable folder:

CommandWhat it does
MCP.cmd --license statusChecks the license online now and prints the status as JSON (licensed, trial, days left, last validation, grace end, message).
MCP.cmd --license activate <key>Activates the key on this device.
MCP.cmd --license trialStarts this computer's 14-day free trial.
MCP.cmd --license devicesLists the devices using the saved key: id, name, platform, activation date and whether it is this device.
MCP.cmd --license deactivateDeactivates this device and removes its saved activation.
MCP.cmd --license deactivate <deviceId>Deactivates another device by the id shown by devices.

The command exits with code 0 on success, 1 on a license error (printed as License error (CODE): message) and 2 for an unknown subcommand, which prints the usage line MCP.cmd --license status | activate <key> | trial | devices | deactivate [deviceId].

Note. There is no environment variable or switch that skips licensing. Hidden or automated desktop runs without a license print License required: … and exit with code 1 instead of waiting at the license window.

License messages

These are the messages the license window, the sidebar tooltip and MCP.cmd --license can show, with the code that MCP.cmd prints and what to do.

CodeMessageWhat to do
NOT_ACTIVATEDEnter your license key to activate Isberg Labs on this device.Activate a key or start the trial.
KEY_INVALIDThis license key was not found. Check it and try again.Copy the key again from your email or the thank-you page, without extra spaces.
DEVICE_LIMITThis license is already active on another device. Deactivate that device (for example a replaced PC), then activate this one.Deactivate the old device from the list that appears, then activate. See above.
DEACTIVATEDThis device is no longer activated for your license. Activate it again with your license key.The device was deactivated elsewhere. Activate again (after freeing the slot if needed).
OFFLINE_TOO_LONGThe license has not been validated online for more than 14 days. Connect to the internet and retry.Connect, then Retry online.
CLOCKThe system clock is earlier than the last license check. Correct the date and time, then retry online.Fix the Windows date and time (turn on Set time automatically), then Retry online.
DEVICE_MISMATCHThe saved license belongs to another device. Activate this device with your license key.The Data folder came from another PC. Activate on this PC.
TAMPEREDThe saved license data is damaged or was modified. Retry online or activate again.Retry online, or activate the key again.
NETWORKCould not reach the license server. Check the internet connection and retry.Check the connection, proxy or firewall for license.isberglabs.com over HTTPS, then retry. Your offline grace keeps running.
SERVICEThe license server rejected the request: detail (for example the license server is busy, retry later).If busy, wait; retries are automatic. Otherwise follow the detail.
SIGNATUREThe license server response could not be verified.Something between you and the server changed the response (for example an intercepting proxy). Retry on another network.
SUSPENDEDThis license is suspended. Contact Isberg Labs support.Email [email protected].
BANNEDThis license is blocked. Contact Isberg Labs support.Email [email protected].
EXPIREDThis license has expired. Contact Isberg Labs support.Lifetime licenses do not expire; email [email protected].
INVALIDThis license is not valid for Isberg Labs.The key belongs to another product or policy. Check you pasted the right key.
TRIAL_ENDEDYour 14-day free trial has ended. Enter a license key to keep using Isberg Labs; your projects are untouched.Buy and activate a license.
TRIAL_USEDThis computer has already used its free trial. Enter a license key to keep using Isberg Labs.Buy and activate a license.
TRIAL_LOCKEDThis trial key belongs to another computer. Start your own free trial or enter a license key.Start a trial on this computer, or activate a license.
TRIALS_PAUSEDFree trials are paused right now. Try again later.Try again later, or buy a license.
TRIALS_BUSYToo many trials are being started right now. Try again later.Try again in a few minutes.
RATE_LIMITEDToo many trial requests from this network. Try again later.Try again later or from another network.
TRIAL_UNAVAILABLEFree trials are not available in this build.Activate a license key.
NOT_CONFIGUREDThis build has no license service configured.The build is incomplete. Download the official release again.

If two Isberg Labs processes check at the same moment (for example the studio and an MCP server), one of them may briefly report Another Isberg Labs process is contacting the license server. They share one check, so this clears by itself.

What the license check sends and stores

Sent to the license server

  • At activation: your license key, a device fingerprint, the computer's name (shown in your device list) and the platform (Windows).
  • At each validation: your license key, the device fingerprint and a random one-time number.
  • When you start a trial: the device fingerprint, a second salted hash of the PC's hardware UUID (so reinstalling Windows does not reset the trial) and the answer to a short proof-of-work challenge. The trial service keeps IP addresses only as keyed hashes, for rate limiting.

The device fingerprint is a SHA-256 hash of a salted copy of the Windows MachineGuid. The raw ID never leaves the PC. No project data, file names, usage data or editor content is sent.

Network allowance

The studio blocks remote network requests except to the configured license server over HTTPS (https://license.isberglabs.com). Editors, exports, MCP tools and plugins run locally. Buy a license opens your own web browser.

At purchase

Stripe processes the payment. The store keeps your order id, license key(s) and email address so it can show and email your key. The key is emailed through a transactional email service.

Stored on your PC

The activation is saved in Data\license.json inside the portable folder. It holds the key, the license and device ids, the fingerprint, the last signed validation from the server and a clock watermark, protected by a device-bound integrity code. license.lock and license-retry.json next to it coordinate the studio and MCP processes and their retry timing.

  • The file is per portable folder and shared by the studio, every MCP process and every profile (GAMEBENCH_PROFILE) in that folder.
  • The environment variable ISBERG_LICENSE_DIR moves it to another folder.
  • Deleting it removes the local activation but does not free the device slot on the server. Use Deactivate this device instead.

How the license is protected

  • Every server response is signed (Ed25519) and must echo the one-time number sent with the request, so recorded or fake responses are rejected.
  • The offline grace is computed from the server's signed date and checked at every start; editing the saved file breaks its signature.
  • Device limits, deactivation, suspension and trial end dates are enforced by the server.

Third-party software & notices

Isberg Labs bundles open-source components so that it can run without installing anything. Their licenses and notices ship with the app and stay intact in everything it exports. This chapter lists the main components and where to find their full texts.

Where the full notices are

  • resources\app\docs\THIRD_PARTY_NOTICES.md: the complete notices and provenance record, including every bundled package with its version and license.
  • LICENSE and LICENSES.chromium.html in the portable folder: the desktop runtime (Electron and Chromium) and its dependencies.
  • Each bundled component keeps its own license files next to it under resources\app\vendor\ and resources\app\node_modules\. Those files are authoritative.
  • Exported games carry the notices for what they contain (for example the engine, the Lua extension or the desktop runtime). Keep them when you distribute a game.

Main bundled components

ComponentUsed forLicense
Electron 45.0.0 (Chromium, Node.js)The desktop runtime of the studio; also the player runtime for exported Windows and macOS RPG and JavaScript gamesMIT; Chromium notices in LICENSES.chromium.html
Godot Engine (custom 4.7.2 Windows build; 4.5.2 WebAssembly editor/player and export templates)Game runtime, native project editor, GDScript, native playtests and exportsMIT, with the engine's third-party copyright inventory and authors list
Embedding wrapper for the native engineRunning the engine in-processMIT (Moritz Voss & Contributors)
.NET 10.0.12 runtime and RoslynLocal C# compilation and the integrated .NET runtime exportMIT, with .NET third-party notices
Zig 0.15.2 (LLVM, compiler runtime)Local C and C++ compilation for GDExtensionMIT, with retained LLVM and library notices
SwiftShaderSoftware Vulkan fallbackApache 2.0 and bundled notices
Lua 5.4 via Wasmoon 1.16.0Lua scripting in the editorsMIT (Wasmoon and Lua)
Lua GDExtension 0.7.0 (Lua 5.4.7, godot-cpp, sol2, tree-sitter)Lua scene scripts in playtests and exported gamesMIT, with the extension's third-party notices
Eclipse Temurin JDK 17.0.20.1+1Android export (build and signing)GPLv2 with Classpath Exception, and bundled component licenses
Android SDK Build-Tools 35.0.1 and Platform-Tools 37.0.1Android exportAndroid SDK terms and component notices (retained)
bundletool 1.18.3Android App Bundles and APK setsApache 2.0
sharp 0.35.5 and libvips (with libpng, libwebp, mozjpeg, libtiff, libheif, aom, lcms and others)Image decoding, encoding and conversionApache 2.0; native libraries under LGPLv3, BSD, MIT, zlib and similar terms (listed in the notices)
assimpjs 0.0.10 (Open Asset Import Library, Poly2Tri)Importing FBX, Collada and other scene formatsMIT and BSD
draco3d 1.5.9Draco mesh decompressionApache 2.0
fzstdZstandard decompression (TMX chunks)MIT
es-module-lexerModule parsing for JavaScript game exportsMIT
Three.js r1283D views in the World builderMIT
PixiJS Legacy 5.3.12RPG Creator player renderingMIT
EffekseerForWebGL 1.80.8 and sample effectsRPG Creator particle effectsMIT
Model Context Protocol SDK 1.32.2 and zodThe MCP serverMIT
Ported PXL modules (claude-pxl)The pixel-art engine and its .px.js examplesMIT, Copyright (c) 2026 crsolver
perfectPixel ideasGrid recovery in pixel repairMIT attribution
Nine RPG plugin examples by TriacontaneOptional RPG Creator plugin examples (not enabled automatically)MIT, (C) 2015-2017 Triacontane

About eighty smaller JavaScript packages used by the MCP server and the image library are listed with versions and licenses (MIT, ISC, BSD and Apache 2.0) in THIRD_PARTY_NOTICES.md.

Trademarks and reference tools

Isberg Labs reads and writes file formats from other tools so your work can move in and out. Product names such as Godot, Aseprite, Tiled and others are trademarks of their owners and are used only to identify those formats. Isberg Labs is an independent project and is not affiliated with or endorsed by them or by the Godot Foundation.

The sprite lighting, sound generation, avatar and tile-model engines are original implementations. Their feature reference applications' code and artwork are not included.

No generative AI

Isberg Labs includes no generative AI features, model weights, inference runtimes, AI provider controls or AI-generated sample assets. The pixel repair and analysis tools are deterministic algorithms. MCP lets your own AI client operate the editors if you connect one; nothing is sent anywhere by Isberg Labs itself.