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.

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
| Version | 0.21.0 (Windows x64 portable) |
|---|---|
| Editors | 20 editors plus 3 shared panels (Scene/Inspector, Assets, and the bottom dock) |
| Game presets | 10 game types in 19 editors |
| Languages | GDScript, C#, C and C++ (GDExtension), JavaScript (V8), Lua 5.4 |
| Export targets | Windows, macOS, Linux, Android (APK, AAB, APKS), iOS/iPadOS (Xcode project), Web |
| MCP | 375 local tools over stdio, server id gamebench |
| Project file | .isberg (earlier .gbench projects still open) |
| License | One lifetime license, activated on one device at a time, validated online. 14-day free trial. |
| Network use | License activation and validation only. Projects, editors, exports and MCP work stay on your computer. |
| AI | No 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.
| Editor | What it is for | Chapter |
|---|---|---|
| Pixel & animation | Draw sprites, animate layers, repair artwork and build tilesets. | Pixel & animation |
| Textures & terrain | Convert, paint, clone, tile, animate and sculpt materials. | Textures & terrain |
| World builder | Generate towns, buildings, landscapes and floor plans. | World builder |
| 3D scene & animation | Model, rig, animate, light and export complete scenes. | 3D scene & animation |
| Music & composition | Compose, sequence, sample and automate multitrack audio. | Audio |
| Level & playtest | Build game-specific levels and test movement and interactions. | Level & playtest |
| RPG Creator | Build RPG maps, database records, characters and events; playtest and export your adventure. | RPG Creator |
| Tile modeler | Build textured tile geometry and paint vertices. | Tile modeler and Vertex painter |
| Vertex painter | Paint mesh colors, edit normals and refine vertex masks. | Tile modeler and Vertex painter |
| Sprite lighting | Create normal, height, specular and occlusion maps. | Sprite lighting |
| Audio workshop | Layer procedural sounds, mix local recordings and shape ambience. | Audio |
| Parameter sound | Design layered sounds with editable controls and native sound-project formats. | Audio |
| Sound designer | Synthesize game sounds with an editable signal chain. | Audio |
| Avatar stage | Rig layered sprites with speaking, blink and motion. | Avatar stage |
| JavaScript | Author full JavaScript modules and run game logic locally. | JavaScript editor |
| Game runtime | Run full local game projects and export playable builds. | Game runtime |
| Formats & interchange | Import local scene formats and transfer geometry into the scene editor. | Formats & interchange |
| Script workspace | Write and run scene scripts locally with inspectable state. | Script workspace & languages |
| Shader graph | Build editable material graphs and preview their compiled shaders. | Shaders |
| Shader materials | Edit 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.
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.
Monospacemarks 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
| Item | Requirement |
|---|---|
| Operating system | Windows 10 or 11, x64. The studio itself runs only on Windows; it exports games for other platforms. |
| Disk space | About 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. |
| Graphics | A 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. |
| Internet | Needed 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 software | None. 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
- Download
Isberg Labs 0.21 Portable.zipfrom the Download section of isberglabs.com. The same section shows its SHA-256 checksum. - 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.sha256file, if you have it). - Extract the whole ZIP to a short path you can write to, for example
C:\Isberg LabsorD:\Isberg Labs. Deep folders such asDownloads\…can hit the Windows path-length limit. AvoidC:\Program Files: the folder must be writable because it holds your preferences, recovery copies and license.
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
| Item | Purpose |
|---|---|
Isberg Labs.exe | The studio. Double-click to start. |
Start Isberg Labs.cmd | Starts the studio from a command prompt or script. |
MCP.cmd | Starts the local MCP server on stdio, and runs license commands (MCP.cmd --license …). See MCP and License commands. |
mcp-config.json | A ready-made MCP client configuration with this folder's absolute paths. |
README.txt | Short 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.html | Notices for the bundled desktop runtime. See Third-party software. |
First start
- 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. - The Isberg Labs license window opens on its own. Nothing else starts until this device has a trial or a license.
- 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.
- When the status shows Active on this device or Free trial — 14 days left, choose Open Isberg Labs. The workspace opens on the Overview.
- 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.
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
- Save your work and close Isberg Labs.
- Extract the new ZIP into a new folder. Do not extract over the old version.
- Copy the old folder's
Datafolder into the new folder. This keeps your preferences, window layout, recovery copy, saved scripts and palettes, and this device's license activation. - If you kept projects or exports in the old
Projectsfolder, copy or move them as well. - Start the new
Isberg Labs.exeand open a project to confirm it works. Keep the old folder until it does. - 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.
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.jsoncopied from another PC is rejected. See Devices and moving your license.
Uninstalling
- 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.)
- Move any projects you want to keep out of the folder.
- 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.
App header
The header across the top of the window holds the project commands.
| Control | What it does |
|---|---|
| Project name field | The 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 status | Reads 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 recovery | Appears only when an automatic recovery copy exists. Opens it. See Automatic recovery. |
| Open project | Opens a saved project. See Open and save. |
| Save project Ctrl+S | Saves 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.cmdfrom the portable folder, or point your client's configuration at it under the server idgamebench. 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 label | Editor | Chapter |
|---|---|---|---|
| 00 | Overview | Overview page with a card for each editor | this chapter |
| 01 | Pixels | Pixel & animation | Pixel & animation |
| 02 | Textures | Textures & terrain | Textures & terrain |
| 03 | World | World builder | World builder |
| 04 | 3D Scene | 3D scene & animation | 3D scene & animation |
| 05 | Music | Music & composition | Audio |
| 06 | Levels | Level & playtest | Level & playtest |
| 07 | RPG | RPG Creator | RPG Creator |
| 08 | Tile 3D | Tile modeler | Tile modeler and Vertex painter |
| 09 | Vertices | Vertex painter | Tile modeler and Vertex painter |
| 10 | Lighting | Sprite lighting | Sprite lighting |
| 11 | Audio | Audio workshop | Audio |
| 12 | Synth | Parameter sound | Audio |
| 13 | SFX | Sound designer | Audio |
| 14 | Avatar | Avatar stage | Avatar stage |
| 15 | JavaScript | JavaScript | JavaScript editor |
| 16 | Runtime | Game runtime | Game runtime |
| 17 | Formats | Formats & interchange | Formats & interchange |
| 18 | Scripts | Script workspace | Script workspace |
| 19 | Nodes | Shader graph | Shaders |
| 20 | Shaders | Shader materials | Shaders |
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 asset | Active editor | Result |
|---|---|---|
| Editable document | Any editor with a compatible document | The 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 document | Overview | Opens the document in the editor that published it. |
| Image | Pixel & animation or Overview | Opens the image as a new sprite in Pixel & animation. |
| Image | Sprite lighting | Loads the image as the lighting source. |
| Image | Other editors | Shows "Selected image is ready. Use Import image in this workspace." |
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.
| Tab | What it shows |
|---|---|
| FileSystem | A 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. |
| Animation | Playback 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. |
| Output | A 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. |
| History | The 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. |
| MCP | A 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.
| Layout | Arrangement |
|---|---|
| Floating windows | Every 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 editor | One dock containing only the active editor. |
| Universal workspace | One large dock with all twenty editors as tabs. 3D scene & animation is selected and the left panel switches to the Scene tree. |
| Quad view | Four 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 right | Splits 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 below | The 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.
| To | Do this |
|---|---|
| Move a window | Drag its title bar. |
| Resize a window | Drag any edge or corner. |
| Bring a window forward | Click anywhere in it. |
| Minimize | Title-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 restore | Title-bar □ (it changes to ▣ while maximized), or double-click the title bar. A maximized window fills the desktop. |
| Close | Title-bar × closes the window and all of its tabs. The editors stay loaded with their documents. |
| Float a docked editor | In docked layouts, the title-bar ↗ with the tooltip "Float editor", or drag its tab onto the desktop. |
| Move an editor to another monitor | The 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 window | The 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 up | Cascade arranges the visible editor windows in an overlapping cascade. Minimized windows and the utility panels are not moved. |
| Bring back desktop windows | Gather (shown only while an editor is on another monitor) returns all of them to Studio. |
| Cancel a drag or resize | Press 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
.isbergprojects. 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.").
- 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").
- The editor opens in its own window, titled "Editor — Isberg Labs", with its current document. Its window inside Studio is locked until it returns.
- 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.
- 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.jsonin the portableDatafolder (or your profile folder), not in the project file. Up to 48 editor placements are kept.
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
Datafolder, or in your profile folder when you useGAMEBENCH_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.
| Keys | Action | Notes |
|---|---|---|
| Ctrl+S | Save project | Works 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+Z | Undo (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+Z | Redo (shared history) | Same rules as Undo. |
| Esc | Cancel a window drag or resize | The window returns to its previous position and size. |
| Arrow keys (title bar focused) | Move the floating window 10 px | Add Alt for 1 px. |
| Shift+arrow keys (title bar focused) | Resize the floating window 10 px | Add Alt for 1 px. |
| Double-click a title bar or tab | Maximize or restore | |
| F12 | Open or close the developer tools | In 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.
| Editor | Keys | Action |
|---|---|---|
| 3D scene & animation | Shift+click | Add a component (vertex, edge or face) to the selection |
| Ctrl+click | Remove a component from the selection | |
| Level & playtest (editing) | Delete | Delete the selected object |
| Level & playtest (local playtest) | W A S D or arrow keys | Move |
| Shift | Sprint | |
| Space | Jump | |
| C | Toggle crouch | |
| N | Toggle noclip | |
| Space / left Ctrl | Move up / down while noclip is on | |
| F | Toggle the torch (when the level enables it) | |
| RPG Creator (playtest canvas) | Arrow keys or W A S D | Move the player |
| Enter or Space | Interact, or advance the current message | |
| Tile modeler (canvas) | Tab | Switch between the Draw and Select tools |
| W A S D | Move the cursor one grid step (and the selection, unless the Draw tool is active or Shift is held) | |
| Hold Space | Make W/S move in depth instead of up and down | |
| Q / E | Rotate the selection 90° one way or the other around the drawing plane's axis | |
| Ctrl+A | Select all | |
| Ctrl+C / Ctrl+V | Copy / paste | |
| Delete | Delete the selection | |
| Vertex painter | Esc | Cancel the stroke being painted |
| F1 / F2 | Paint the color channel / the normal channel | |
| X | Swap the brush and background colors | |
| Shift+E | Eyedropper tool | |
| [ / ] | Make the brush larger / smaller | |
| Ctrl+V, Ctrl+E, Ctrl+F | Brush targets vertices, edges or faces | |
| Ctrl+mouse wheel | Change the brush radius | |
| Mouse wheel | Zoom the view | |
| Avatar stage | Esc | Cancel the current drag |
| 1–9, 0 | Switch to costume 1–9; 0 is costume 10 | |
| Arrow keys | Nudge the selected layer 1 px (Shift: 10 px) | |
| Space | Toggle speaking | |
| Keys you assign | Expression 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 workspace | Ctrl+Enter | Attach the script to the selected scene node |
| Tab | Insert four spaces in the code editor | |
| JavaScript, Shader materials | Tab | Insert 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.
studio_status: active editor, loaded editors and asset shelf.studio_switch: switch to a named editor.workspace_dock: open, close, split, move, float, set bounds, focus, minimize, restore, maximize or cascade windows. Utility panels are$tools,$projectand$bottom; bounds are in workspace pixels.workspace_layout: read or replace the complete layout, including floating windows back to front and the maximized group.workspace_window: show or hide the bundled editor window.workspace_commands: list every setting, action and file control of an editor with stable IDs.workspace_execute: set named settings and run a named action.workspace_import: load local files into an editor's file control.workspace_file_job: inspect or finish a pending export.workspace_save/workspace_open: save or restore one editor's complete state as JSON.studio_inspect,studio_click,studio_fill,studio_select,studio_canvas: inspect and operate editor controls and canvases.studio_capture: capture the workspace as PNG.studio_publish: add a local image to the asset shelf or send it to an editor.studio_workspace_state: read or replace an editor's structured state.studio_capabilities: list tool categories and automation coverage.
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
- Type a name in the project name field in the header (optional).
- Press Save project or Ctrl+S.
- Choose a location. The suggested file name is the project name with
.isbergadded; 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
| Part | Contents |
|---|---|
| Project | Project ID and name. |
| Editors | The 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 shelf | Image assets (embedded as PNG) and editable document assets with their revisions, editor links, conversion options and dependencies. |
| Layout | The 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). |
| History | The shared Undo/Redo history, including the redo branch. |
| Preferences | A 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
.isbergfile 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.
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.
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 Data | Holds |
|---|---|
| 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.json | Placement of the main window and of editors on other monitors. |
license.json | The license record of this installation. See License. |
lua-plugins\, palettes\, scripts\, styles\ | Lua extensions, palette library, scripts and style cards of Pixel & animation. |
| Cache folders | Rendering 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'
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.
- 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.
- 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.
- 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
| From | To | What transfers |
|---|---|---|
| 3D scene & animation, Formats & interchange, Level & playtest, Vertex painter, Tile modeler | Any of those editors | Editable 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 editors | Pixel & animation, Sprite lighting, Avatar stage, Textures & terrain, Tile modeler, Shader materials, scene editors | An 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 materials | Scene editors, Shader graph | Validated shader source assigned to or taken from a material. A graph stays restorable after its generated shader text was edited. |
| Script workspace | Scene editors, JavaScript | Script source, language and exported properties on a node, or ready JavaScript modules copied unchanged. No automatic language translation. |
| JavaScript | Scene editors (and back) | The game scene with the complete module map and game state. |
| Sound designer, Parameter sound, Music & composition, Audio workshop | Music & composition, Audio workshop | A rendered mono or stereo PCM bounce, added as a source or clip. |
| A converted document | Its original editor | The 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.
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.
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_packpacks 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_unpackchecks every path and hash before it writes anything. Existing files are only replaced withoverwrite. Bundles named.gbundlefrom 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_inspectandarchive_extract_zipread 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_pckandarchive_stage_projectread 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.
| Document | Extension | Earlier names (still open) | Written by |
|---|---|---|---|
| Complete workspace project | .isberg | .gbench, .veldryne | Save project, automatic recovery |
| Pixel sprite or animation | .isbsprite | .gbsprite, .pforge | Pixel & animation |
| Editable tile-model project | .isbtiles | .gbtiles | Tile modeler, Formats & interchange |
| RPG project | .isbrpg | .gbrpg | RPG Creator |
| Sprite-lighting project | .isbmaterial | .gbmaterial | Sprite lighting |
| Sprite-lighting preset | .isbpreset | .gbpreset | Sprite lighting |
| Parameter sound | .isbsound | .gbsound | Parameter sound |
| Avatar rig | .isbavatar | .gbavatar | Avatar stage |
| Tile clipboard | .isbtileclip | .gbtileclip | MCP pixel_tile_copy |
| Project bundle | .isbundle | .gbundle | MCP project_pack |
| Scene painter document | .isbscene | .gbscene | MCP 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.
MCP tools
workspace_project_save/workspace_project_open: save or open the whole project; large assets never travel through the MCP response.workspace_project_begin/workspace_project_job: start a save or open in the background, poll its progress or cancel it.workspace_project_archive: inspect an archive; import or export a data block.workspace_recovery: locate and optionally restore the recovery project.studio_project_state: read or replace the complete project state.workspace_history: inspect, undo, redo or clear the shared history.asset_documents: list shared assets, revisions, links and dependency warnings.asset_document_publish: share or update an editor's document.asset_document_apply: open an asset in an editor, with adapteroptionsand optionalforce.asset_document_adapters: list conversion routes and their options.asset_document_import/asset_document_export: load an editor-state JSON file as an asset, or write an asset to a file.asset_document_dependencies: set dependencies; refuses cycles.asset_document_remove: remove an asset.project_pack/project_unpack: create or unpack.isbundlefiles.archive_inspect,archive_extract_zip,archive_extract_pck,archive_stage_project: inspect and extract ZIP and PCK archives.
Troubleshooting
- "This is not a compatible project."
- The file is not an Isberg project (or is damaged). Check that you chose an
.isberg,.gbenchor 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
- Open the editor you want to change and make it the active editor.
- Press Game presets in the workspace bar. The dialog names the active tool (by its internal ID, for example "Active tool: scene3d").
- 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.
- Enter a Seed (whole number from 0 to 4294967295; default 1).
- 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
.isbergprojects. 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 type | Direction | Frame rate used |
|---|---|---|
| Retro platformer | Bright, readable shapes, brisk movement and short arcade cues. | 12 fps |
| Fantasy RPG | Warm towns, organic materials, exploration and melodic feedback. | 24 fps |
| Dungeon crawler | Compact chambers, stone surfaces, low light and resonant rewards. | 24 fps |
| Sci-fi shooter | Clean sightlines, cool metal, fast movement and sharp electronic cues. | 60 fps |
| Survival horror | Constrained routes, muted surfaces, deliberate movement and sparse audio. | 24 fps |
| Stealth | Alternate routes, low contrast environments and restrained movement. | 30 fps |
| Cozy simulation | Open village spaces, soft surfaces, gentle motion and warm sounds. | 30 fps |
| Strategy / tactics | Readable regions, overview cameras, grid-friendly assets and clear alerts. | 30 fps |
| Racing | Open circuits, high visibility markings, reflective surfaces and energetic cues. | 60 fps |
| Puzzle | Compact 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).
| Editor | Effect of applying a preset |
|---|---|
| Pixel & animation | Sets 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 & terrain | Sets 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 builder | Replaces the active map editor's map with a generated starting map. See World builder styles. |
| 3D scene & animation | Sets 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 modeler | Applies the same material palette and surface response to the current model. |
| Formats & interchange | Applies the same material palette and surface response to the loaded scene. |
| Vertex painter | Sets 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 lighting | Switches 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 stage | Sets 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 workshop | Replaces the current sound with a genre-specific sound recipe (the interface event). See Audio presets. |
| Sound designer | Replaces the current settings with a genre-specific sound recipe (the interface event) using the seed. |
| Parameter sound | Replaces the current sound with a genre-specific editable parameter sound (the interface event). |
| Music & composition | Replaces the composition with a genre-specific editable music sketch. |
| Level & playtest | Replaces the level with a generated game layout (standard difficulty, scale 1). See Level layouts. |
| JavaScript | Adds 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 workspace | Replaces 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 runtime | Generates 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 graph | Replaces the graph with a new "type material" graph: a palette color, the type's roughness and metalness, unshaded for Retro platformer. |
| Shader materials | Replaces 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.
| Button | Writes or reads | Details |
|---|---|---|
| Export recipe | editor-type.game-preset.json | A small recipe: editor, game type, seed and recipe version. It contains no content. |
| Export current tool preset | editor.tool-preset.json | The editor's complete current content and settings, up to 64 MiB. Disabled for Game runtime ("Use Save project to embed native project assets."). |
| Import preset | a .json file of either kind | A 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.
| Control | Values (default first) | Purpose |
|---|---|---|
| Game style | The ten game types | Genre of the generated sound or music. |
| Event (not in Music & composition) | interface, pickup, jump, impact, weapon, footstep, ambience, victory | Which game event to synthesize. |
| Seed | 0 to 4294967295 (1) | Same seed, same sound; neighbouring seeds give variations. |
| Apply game sound / Apply game music | Replaces the current sound or composition with editable settings. Choosing options alone changes nothing. | |
| PCM bits | 24, 16 | Bit depth for the delivery and bank exports. |
| Delivery Hz | 48000, 44100, 22050, 96000 | Sample rate for the delivery and bank exports. |
| Peak dBFS | −3, −6, −1 | Sample-peak headroom. |
| Taper loop edges | off | Applies a 10 ms edge taper for loops without changing the frame count, and writes the loop bounds into the recipe. |
| Export game WAV + recipe | Writes game-audio-delivery.zip with sound.wav (your current audio) and recipe.json (source settings, processing and measurements). | |
| Variations | 3, 1, 2, 4, 8 | Variations per event for the bank. |
| Export event bank ZIP | Writes 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.
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 type | Layout and starting behavior |
|---|---|
| Retro platformer | Rising jump platforms, collectibles and a midpoint checkpoint; third-person camera and jumping. |
| Fantasy RPG | Village square, main road and an exploration pickup; return to the entrance to complete the route. |
| Dungeon crawler | Connected chambers, doorways, pillars and a key-gated exit; top-down camera. |
| Sci-fi shooter | Symmetrical arena cover, side lanes and health pickups; first-person movement. |
| Survival horror | Corridor with side rooms, safe-room checkpoint, exit key, limited sprint and an optional torch. |
| Stealth | Alternating sightline screens, low cover, a crouch passage and a retrieve-and-return route. |
| Cozy simulation | Homestead, gardens, gathering pickups and a delivery goal. |
| Strategy | Mirrored bases, resource landmarks and a central objective; top-down map inspection. |
| Racing circuit | Closed circuit with three ordered checkpoints before the finish; on-foot route inspection. |
| Puzzle exploration | Three 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
MCP tools
workspace_game_presets: list the game types and their effect in all nineteen editors.workspace_game_preset_apply: apply a type to one editor withworkspace,styleand an optionalseed; the same undoable operation as the dialog.level_create: create a level from a template or a game style withseed,difficultyandscale.level_preflight: check a saved level and optionally write the report.world_editor_state: read or replace a map editor's native state.
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.
| Mode | What it is for | See |
|---|---|---|
| Editor | Draw, animate and edit sprites. | most of this chapter |
| Grid repair | Snap enlarged or blurry pixel art back to its true pixel grid. | Repair workspaces |
| Pixelizer | Turn any image into pixel art. | Pixelizer |
| Ripper | Unwarp a surface from a photo into a flat texture. | Texture Ripper |
| Video | Sample video frames into a pixel animation with one shared palette. | Video |
| Tiles | Tilesets, autotiles and tile maps. | Tilesets and tilemaps |
| Spec | Sprites described as JSON shapes, ramps and poses. | Art as code: Spec |
| Code | Sprites written in the PXL language (.px.js). | Art as code: PXL |
| Batch | Run 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
.isbspritedocument: 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.isbspritepath. - File > Save Project As… (Ctrl+Shift+S) always asks for a path.
- Older
.gbspriteand.pforgedocuments still open. Aseprite.ase/.asepritefiles 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.
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\recoveryfolder 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:
| Field | Default | Meaning |
|---|---|---|
| Enabled | yes | Turns onion skin on. |
| Previous frames / Next frames | 1 / 1 | How many frames to show before and after. |
| Opacity % | 45 | Opacity of the nearest frame (2–100). |
| Opacity step % | 15 | Opacity lost per further frame. |
| Type | merge | merge shows the frames as they are; tint colors them. |
| Current layer only | no | Show only the active layer's cels. |
| Loop through tag | no | Wrap around inside the current tag. |
| Position | behind | behind 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.
| Tool | Icon | Key | What it does |
|---|---|---|---|
| Rectangular marquee | ⬚ | M | Rectangle selection. Drag inside a selection to move its pixels; hold Ctrl to move a copy. |
| Elliptical marquee | ◌ | Shift+M | Ellipse selection. |
| Lasso | ➰ | Q | Freehand selection. |
| Polygonal lasso | ⟁ | Shift+Q | Click points; Enter, a double-click or clicking the first point closes it. |
| Magic wand | ✧ | W | Selects a color region, using the fill options. |
| Move | ✥ | V | Moves 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 | ✎ | B | Freehand drawing with the brush and ink. |
| Spray | ⁘ | Shift+S | Sprays random dots inside a radius while the button is held. |
| Eraser | ⌫ | E | Erases to transparent. Right-click replaces the primary color with the secondary color. |
| Eyedropper | ⌖ | I | Click 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 | ◩ | G | Flood fill. |
| Gradient | ▤ | Shift+G | Drag 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 | ╱ | L | Straight line; Shift snaps to 15° steps. |
| Curve | ∿ | Shift+L | Drag the line, then drag the first and the second control point. |
| Rectangle | ▭ | U | Rectangle; Shift makes a square, Alt draws from the center. |
| Ellipse | ◯ | Shift+U | Ellipse; 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 | ✐ | D | Draw a freehand outline; it is closed and filled. |
| Polygon | ⬠ | Shift+D | Click points; click the first point, double-click or press Enter to close. |
| Blur | 💧 | R | Averages pixels under the brush. |
| Jumble | ⁂ | Shift+R | Swaps pixels randomly with near neighbors. |
| Text | T | T | Click, type the text, then move it and press Enter. Bitmap pixel fonts or system fonts without anti-aliasing. |
| Hand (pan) | ✋ | H | Pans the view. |
| Zoom | 🔍 | Z | Click zooms in; right-click or Alt+click zooms out. |
| Stamp body part | ◈ | P | Places 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+C | Draw, 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
| Button | Toggle |
|---|---|
| PP | Pixel-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:
| Tool | Option | Values (default) |
|---|---|---|
| Paint bucket, Magic wand | Tolerance | 0–255 (0) |
| Contiguous | on | |
| Visible layers | off; on uses the composite of all visible layers as the boundary | |
| 8-connected | off (4-connected) | |
| Stop at grid | off; on stops the fill at tile grid lines | |
| Spray | Radius / Density | 1–64 (6) / 1–100 (6) |
| Gradient | Type | linear, radial |
| Dither | none, bayer2, bayer4 (default), bayer8 | |
| Gradient, Noise, Voronoi | Colors | FG + BG (default) or palette FG→BG (every palette entry between the two colors) |
| Area | selection / layer (default) or fill region (the region under the click, using Tolerance and Contiguous) | |
| Noise fill | Scale / Seed | 1–64 (1) / 0–99999 (1) |
| Voronoi fill | Cell / Seed | 2–128 (8) / 0–99999 (1) |
| Rectangle, Ellipse, Triangle, Rotated rectangle, Circle, Polygon | Filled | off |
| Rectangle | Corner radius | 0–64 (0) |
| Rotated rectangle | Rotation | −180 to 180, step 5 (30) |
| Eyedropper | Sample | composite (default, includes reference layers) or layer |
| Selection tools | Mode | replace, add, subtract, intersect |
| Transparent BG while moving | off; on drops pixels of the secondary color from the moved selection | |
| Move | Wrap / Transparent BG | off / off; Wrap moves the cel with wrap-around |
| Text | Font | 3x5, 5x7 (default), system |
| Family / Size | system font only: text (Arial) / 4–128 (12) | |
| Scale | bitmap fonts only: 1–8 (1) |
Brushes and inks
Brush
| Option | Values (default) | Notes |
|---|---|---|
| Brush | circle (default), square, line, custom | custom uses the image brush made with Edit > New brush from selection. |
| Size | 1–64 (1) | ] bigger, [ smaller. |
| Angle | −180 to 180, step 15 (0) | Square and line brushes only. |
| Image brush | Stamp image (default), Paint brush (FG), Pattern: source, Pattern: destination | Custom 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.
| Ink | Effect |
|---|---|
| Simple (default) | Opaque colors replace the pixel; translucent colors or reduced opacity composite over it. |
| Alpha compositing | Always composites the color over the pixel. |
| Copy color+alpha | Writes the color and its alpha exactly, including transparency. |
| Lock alpha | Recolors only opaque pixels and keeps their alpha. |
| Shading | Steps 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). |
| Behind | Paints 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
| Option | Values (default) | Effect |
|---|---|---|
| Trace | default, pixel-perfect (default), dots | Pixel-perfect removes the L-shaped corner pixels of 1-px strokes. Dots stamps only at the sampled pointer positions, without joining them. |
| Stabilizer | 0–64 (0) | The stroke follows the cursor like a string of this length, smoothing shaky lines. |
| Dynamics | none, pressure, velocity | Varies the brush size with pen pressure or stroke speed. |
| Min | 1–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”.
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 item | Key | What it does |
|---|---|---|
| All | Ctrl+A | Selects the whole canvas. |
| Deselect | Ctrl+D | Clears the selection. |
| Reselect | Ctrl+Shift+D | Restores the last selection. |
| Inverse | Ctrl+Shift+I | Inverts 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 item | Key | What it does |
|---|---|---|
| Copy | Ctrl+C | Copies the selection of the active cel (or the whole cel). Also puts a PNG on the system clipboard. |
| Copy merged | Ctrl+Shift+C | Copies the rendered image of all visible layers as plain RGBA. |
| Cut | Ctrl+X | Copies and erases. |
| Paste | Ctrl+V | Pastes 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 layer | Ctrl+Shift+V | Pastes into a new layer. |
| Paste as new sprite | Ctrl+Alt+V | Opens 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 item | Key |
|---|---|
| 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 item | Key | Fields and behavior |
|---|---|---|
| Sprite Size… | Ctrl+Alt+I | Width (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+C | Width, 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
| Item | Key | What it does |
|---|---|---|
| New layer | Shift+N | Adds 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 cut | Ctrl+J / Ctrl+Shift+J | Moves or copies the selection to a new layer. |
| Duplicate layer, Delete layer | – | |
| Layer properties… | Shift+P | Name, Blend mode, Opacity (0–255), Visible, Locked, Reference layer, Continuous, Group, Color tag + Tag color, User data. |
| Rename layer | F2 | |
| 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 down | Ctrl+E | Merges 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
.isbspritesaves. - 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.
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×to3×); 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
| Item | Key | What it does |
|---|---|---|
| New frame (copy) | Alt+N | Inserts a copy of the current frame after it. |
| New empty frame | Alt+Shift+N | Inserts 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+C | A sprite keeps at least one frame. |
| Reverse frames | Alt+I | Reverses the selected frames. |
| Frame properties… | Alt+P | Duration 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 cels | Alt+L | Links the selected cels of a layer (select 2 or more frames). |
| Unlink cels, Clear cels | – | |
| New tag from range… | Alt+T | Creates 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.
| Control | What it does |
|---|---|
| Stabilize | Aligns every frame on the feet (bottom center) relative to frame 1, to stop jitter. |
| Unify palette | Reduces all frames to one shared palette of 24 colors. |
| Remove flicker | Reverts 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), Generate | Builds 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 action | Appends copies of the current frame with preset durations and a tag named after the action. |
| Walk / puppet: side view / front view, Walk cycle from layers | Builds 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 layers | Splits 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 flash | Insert 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 sheet | Splits an image into frames at transparent gaps, in equal feet-aligned cells, with one tag per row. |
| Align ground | Puts every frame's feet on the deepest common ground line, centered. |
| Check frames | Reports 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 cell | Crops the document to the union of all frames plus 2 px. |
Timing presets
Frame > Create action from preset… offers the same presets.
| Preset | Frames | Durations (ms) | Phases |
|---|---|---|---|
idle | 4 | 300 each | rest, inhale, hold, exhale |
walk | 4 | 120 each | contact, passing, mirrored contact, mirrored passing |
walk6 | 6 | 110 each | contact, down, passing, then mirrored |
run | 6 | 80 each | contact, down, push, flight, mirrored contact, mirrored flight |
attack | 4 | 125, 50, 100, 125 | windup, strike, impact hold, recover |
jump | 6 | 100, 50, 80, 175, 80, 100 | crouch, launch, rise, peak, fall, land |
hurt | 2 | 70, 70 | hit, recoil |
death | 5 | 125 each | hit, 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 (☰)
| Item | Fields 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 all | Deleting 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 colors | Compare the palette with the sprite. |
| Map sprite to palette | Maps 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.
| Field | Shown for | Values (default) |
|---|---|---|
| Color mode | all | RGB, Indexed, Grayscale |
| Palette | Indexed | current palette (N) or extract from sprite |
| Extract colors | Indexed, extract | 2–256 (32) |
| Gray levels | Grayscale | 2–256 (256) |
| Dithering | Indexed, Grayscale | none, ordered (Bayer 2×2), ordered (Bayer 4×4), Floyd–Steinberg |
| Dither strength | Indexed, Grayscale | 0–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_editor Lua.
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.
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:
| Field | Options |
|---|---|
| Operation | Preview 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). |
| Profile | sRGB, 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.
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:
| Operation | Uses fields |
|---|---|
| Set exact RGBA rectangle | x, y, width, height (defaults to the selection), R/G/B/A (0–65535 or linear float) |
| Apply exposure to rectangle | rectangle, Edit exposure stops (−24 to 24) |
| Display exposure / tone map only | Display 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 EXR | Export 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.
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.
| Section | Control | What it does |
|---|---|---|
| Tileset | Tile W × H (default 16 × 16) and Apply | Sets the tile size. An imported sheet is re-split; otherwise the tileset and its autotile sets are emptied. |
| Import PNG…, From editor | Splits an image (or the editor's current frame) into tiles in grid order. Trailing empty tiles are dropped. | |
| + Selection | Adds the editor selection (or a sprite exactly one tile in size) as a tile. | |
| Delete tile | Deletes the selected tile, empties the cells that used it, renumbers the rest and removes autotile sets that contain it. | |
| Export PNG…, Clear | Saves the tileset sheet; Clear empties the tileset, its sets and the map. | |
| Autotile generator | Set: 16 (4-bit) or 47 (blob); keep palette; Generate from tile | Builds 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 tile | Adds a tileable texture-recipe tile, using the Textures panel colors when set. | |
| Extract from level image | Offset X, Y; flips (on); Open level image…, From editor | Cuts 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. |
| Map | Size W × H (default 20 × 12), Resize, Clear map, Fill with tile | Resize keeps the top-left; Fill paints every cell with the selected tile and flips. |
| Export / editor | Export .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 → editor | Open the rendered map, or the tileset sheet with the map stored in the document, as editor tabs. | |
| Map → tilemap layer | Adds the map as an editable tilemap layer (tileset, tile ids, flips and autotile sets) to the current editor sprite. | |
| Save into doc, Load from doc | Store 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.
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
| Format | Direction | Notes |
|---|---|---|
Tileset sheet .png | import, export | Tiles mode. |
Tiled JSON .tmj + tileset PNG | import, export | Orthogonal, 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. |
| CSV | export | Tile ids, −1 = empty. |
| Map PNG | export | Rendered map. |
.isbsprite | open, save | Keeps tilemap layers, tilesets, autotile sets and tile metadata. |
.aseprite/.ase | import only | Tilemap layers, tilesets, flips and tile metadata are read. |
.isbtileclip | MCP only | Tile 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.
| Types | Rules |
|---|---|
bool, int8, uint8, int16, uint16, int32, uint32 | Exact integers in range. |
int64, uint64 | Exact; stored as decimal strings. |
fixed | Signed 16.16, exact multiples of 1/65536. |
float, double | Finite numbers or the strings NaN, Infinity, -Infinity, -0. |
string | Up to 65,535 UTF-8 bytes. |
point, size, rect | int32 fields. |
vector, map | Nested up to 128 levels; at most 1,000,000 entries and 64 MiB in total. |
uuid | 32 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
- 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.
- In the Editor, run Sprite > Auto-repair anatomy… and read the open items it reports.
- Fix the remaining parts by hand: stamp clean hands, feet, eyes and mouths from Body parts (anatomy fix), draw limbs, mirror halves.
- Clean up with Fix & clean (orphans, outline, pixel-perfect, Clean all).
- Open Analyze and click Analyze + critique; fix every listed item until the verdict is SHIP.
- 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.
| Control | Default | What it does |
|---|---|---|
| Pixel size (0 = auto) | 0 | Size of one enlarged pixel. 0 detects it. |
| Offset X, Offset Y | 0 | Grid origin, used when Pixel size is set. |
| Grid fit | each 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 range | 0.3 (0.05–0.5) | How far, as a fraction of a cell, a line may move from the uniform grid. |
| Cell sampling | mode (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 colors | 24 (0–256) | Palette limit; 0 keeps all colors. |
| Merge shades ΔE | 5 (0–40) | Merges near-identical shades into the more common one; 0 = off. |
| Remove background | off | Removes the most common border color by flood fill. |
| Remove orphan pixels | on | Replaces lonely pixels with the dominant neighbor color; high-contrast pixels (eye shines, sparkles) are kept. |
| Repair outline | off | Turns every edge pixel into the detected outline color and removes doubled corners. |
| Re-detect grid, show grid | show on | Detect 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:
| Option | Default | What it does |
|---|---|---|
| Strip fake checkerboard | off | Removes a fake transparency checkerboard connected to the border before detection. |
| Exact scale first | on | If the image is an exact integer upscale, uses that scale. While an exact upscale is found, it overrides typed sizes and offsets. |
| Harden alpha steps | off, 0 255 | Snaps alpha to the listed steps (for example 0 64 160 255). |
| Despeckle clusters < N px | off, 3 | Removes opaque blobs smaller than N pixels. |
| Dedupe colors, tol | off, 8 | Merges colors within the tolerance onto the most used one. |
| Dehalo | off | Replaces 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. |
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:
| Control | Default | What it does |
|---|---|---|
| Width (px) | 96 (4–1024; set on load) | Output width; height keeps the aspect ratio. |
| Downsample | mode (crisp) | mode (crisp), average (smooth), median, nearest. |
| Colors | 16 (2–256) | Palette size. |
| Dither, Dither strength | none, 0.5 | none, bayer2, bayer4, floyd. |
| Contrast, Saturation, Brightness | 0 (−100 to 100) | Adjustments applied before downsampling. |
| Outline | off | Adds a 1-px outer outline in the detected outline color. |
| Remove background first | off | Removes 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.
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
| Button | What it does |
|---|---|
| Orphans | Removes single-pixel noise. |
| Repair outline | Every edge pixel becomes outline color; doubles are removed. |
| Pixel-perfect | Removes L-corners in 1-px outlines. |
| Add outline | Adds a 1-px outline in the primary color. |
| Remove BG | Flood-removes the background from the edges. |
| Merge shades | Merges near-identical shades. |
| Smooth noise | Majority filter. |
| Hard alpha | No semi-transparent pixels (alpha ≥ 128 becomes opaque). |
| Mirror L→R, Mirror R→L | Copies one half onto the other. |
| Rotate N ° + RotSprite | Clean pixel-art rotation (default 15°, step 5). |
| Strip checker, Dehalo, Despeckle <N, Dedupe colors, Harden steps, Selout | The 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 ÷N | Detect an exact integer upscale (or estimate one) and shrink the whole sprite by it. |
| Clean all | Harden 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.
| Part | Parameters (default, range) |
|---|---|
| hand open | size (12, 6–40), fingers (5, 3–5; total digits including the thumb, 4 = cartoon glove), thumb left/right |
| fist | size (10, 6–32), fingers (4, 3–4), thumb left/right, cuff no/yes |
| foot | size (12, 5–40), style shoe/boot/bare, facing right/left |
| eye | size (6, 3–20), look center/left/right/up/down, style round/dot |
| mouth | width (8, 3–30), style open/smile/frown/flat/o |
| head | width, 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 item | Key | Parameters (default) |
|---|---|---|
| Replace color… | – | From (primary), To (secondary), Tolerance (0–255, 0) |
| Invert… | Ctrl+I | Invert alpha too (off) |
| Brightness / contrast… | – | Brightness, Contrast (−100 to 100, 0) |
| Hue / saturation… | Ctrl+U | Mode (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 (
colorscreens a glow color;rampstays 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.
| Fill | Settings |
|---|---|
| Texture recipe (default) | Recipe (Stone, Wood planks, Metal plate, Grass, Fabric weave, Brick), Tile size (16, 4–256), Seed. Recipes are tileable. |
| Noise, Noise circle | Seed, Scale |
| Voronoi | Seed, Cells (8), Border color |
| Dither (2 colors) | Mix (0.5), Pattern (Bayer 2×2, Bayer 4×4, Bayer 8×8, Noise) |
| Gradient dither | Shape (Linear/Radial, vertical/horizontal/diagonal), Pattern |
| Scatter parts | Parts, 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 (
transparenterases,keepleaves 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).
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_*andwalk_*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
| Key | Meaning |
|---|---|
size | Required [w, h], each 1–1024. |
name, meta | File name; informational notes. |
margin, fit, pad | Scratch 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, outline | top-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. |
params | Default numeric parameters used by pose expressions. |
layers | Required, back to front: name, opacity, blend, visible, pivot and parts. |
frames | duration (100), tag, params, pose. |
actions | Generated frame runs: tag, frames, duration or durations, keys (per-frame or keyframed parameter values) and pose. |
tags | Explicit tags: name, from, to, direction. |
- Tone letters:
ooutline,dshadow,bbase,lhighlight,wwhite,kdark/pupil,ssecondary,Ssecondary shadow. - Part fields:
name,ramporcolor,z,clip(keep only pixels inside another part),light,outline,flat,pivot, and one shape inline orshapes: [...]. - Shapes:
rect,ellipse(x, y, w, h);circle(cx, cy, r);capsule(x0, y0, x1, y1, r, or apointschain);polygon,triangle(points);pixelsandascii(rows of characters:.empty, a tone letter,-erase);part(proceduralhand_open,fist,foot,eye,mouth,head). Any shape can taketoneorerase: true. - Poses target a part, a layer or
*(the whole sprite) withdx,dy,rotate,scale,flip,pivot,hideor 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
pivotand 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 templatebrings 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.jsfile 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
| Group | Statements and ops |
|---|---|
| Palette | use("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. |
| Colors | A palette key, "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"; "." leaves a pixel, "_" erases it. |
| Assets | sprite(name, opts?, ...items), anim(name, opts?, ...items), scene(name, { w, h, bg? }, ...items). Names starting with _ are parts (not exported). |
| Asset options | w, 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. |
| Structure | Grid 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. |
| Shapes | px, rect, box, line, hline, vline, ellipse, circ, ring, poly, fill |
| Tone | dither, grad, noise, recolor, shade, light |
| Placement | stamp, tile, pattern, tilemap, scatter, wire; options seed, reseed, frame, delay, rdelay, swap, rswap, flip, rflip, rot. Placing an animated asset animates its parent. |
| Other | grid(x, y, str), text(x, y, str, c, opts?) (built-in 3×5 font), clip(where, ...items) |
| Light | lamp, bump, normals, lighting, glow (lighting and glow go directly in a sprite or scene, after what they affect) |
| Helpers | box3 (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.
| Format | Opens as | Notes |
|---|---|---|
.isbsprite (also .gbsprite, .pforge) | Editable document | The native format; everything is kept. |
.aseprite, .ase | Editable 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. |
.png | Indexed, RGBA, grayscale or 16-bit document | Indexed 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. |
.apng | Animation | Every 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, .webp | Animation or still | Animated files become frames with their durations (minimum 10 ms). |
.jpg, .jpeg, .tif, .tiff, .avif | Still image | |
.exr | Float32 precision sprite | Single-part, uncompressed scanline OpenEXR only. |
.px.js | Code mode | PXL source; other .js files are refused. |
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.
| Field | Default |
|---|---|
| Type: By rows, By columns, Horizontal strip, Vertical strip | By rows |
| X, Y | 0 |
| Width, Height (cell size) | 32 |
| Horizontal padding, Vertical padding (gap between cells) | 0 |
| Include partial tiles | off |
| Skip empty cells | on |
| 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 (
frame2beforeframe10). - 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;
bottomalignment 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
| Item | Key | Opens |
|---|---|---|
| Export As… | Ctrl+Alt+Shift+S | The Export As dialog. |
| Export Sprite Sheet… | Ctrl+Alt+E | The sheet dialog. |
| Repeat Last Export | Ctrl+Shift+X | Re-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
| Format | Extension | Notes |
|---|---|---|
| PNG | .png | One 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 | .png | Like PNG, with a default name of <name>-{frame01}.png. |
| Animated PNG | .apng | See Animated PNG. |
| Animated GIF | .gif | One 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) | .webp | Lossless; animations loop forever. |
| JPEG | .jpg | Flattened on the background color (white when none is set). Uses Quality. |
| TIFF, AVIF | .tiff, .avif | One file per frame; TIFF uses deflate, AVIF is lossless. |
| Isberg sprite (.isbsprite) | .isbsprite | Editable copy limited to the selected frames (and to one layer with Selected layer). |
| SVG | .svg | One rectangle per run of equal pixels, crisp edges, colors in sRGB. |
| CSS box-shadow (+ HTML) | .css + .html | A box-shadow sprite with a sample page; several frames animate with @keyframes. |
| Preview PNG (checker + grid) | -preview.png | Enlarged frames on a checkerboard with a grid. |
| Field | Values (default) |
|---|---|
| Format, File (… opens a save dialog) | last used, else PNG |
| Scale | 1–64 (1), nearest neighbor |
| Area | Canvas, Selection (its bounding rectangle), Slice: <name> |
| Layers | Visible layers, Selected layer (…), Each layer separately, All layers (incl. hidden) |
| Frames | All frames, Current frame (N), Tag: <name>, Range… with From/to (0-based frame indices) |
| Animation direction | As tags say, Forward, Reverse, Ping-pong, Ping-pong reverse |
| Split tags (one output per tag) | off |
| Composite on background color + Background | off, #000000 |
| Quality (JPEG/WebP/AVIF) | 1–100 (95); WebP and AVIF are written lossless, so this affects JPEG |
| Indexed PNG/APNG when exact | on |
| 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.
Export Sprite Sheet
| Group | Field | Values (default) |
|---|---|---|
| Output | Sheet image | <name>-sheet.png |
| Data format | No 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 names | empty = {title} {frame}.{extension} (with layer or tag when split) | |
| Godot res:// path | empty = res://<sheet file> | |
| Layout | Sheet type | Horizontal strip, Vertical strip, By rows, By columns, Packed (default) |
| Constraint + Value | None (default), Fixed # of columns, Fixed # of rows, Fixed width, Fixed height; value 4 | |
| Merge duplicates, Ignore empty frames, Power-of-two size | on, off, off | |
| Borders | Border padding, Spacing, Inner padding | 0, 1, 0 |
| Trim | No trim, Trim sprite (union), Trim cels | |
| Extrude edges (px) | 0–8 (0) | |
| Selection | as in Export As, plus Split layers, Each layer/tag on its own row, One sheet per layer/tag | off |
- 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 addsanimationsby tag. Godot writes a.tresSpriteFrames 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.
| Action | Rows | Frames | Note |
|---|---|---|---|
spellcast (alias cast) | 0–3 | 7 | |
thrust | 4–7 | 8 | |
walk | 8–11 | 9 | frame 0 is the standing pose |
slash (alias attack) | 12–15 | 6 | |
shoot (alias bow) | 16–19 | 13 | |
hurt | 20 | 6 | down 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.
- Input: Add files… (images, Aseprite and Isberg sprites) or Add folder…; Clear empties the list.
- 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).
- 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). - Run batch (or Stop). Each result card shows before/after; click it to open the result in the Editor. A
recipe.jsonis written next to the results.
| Group | Operations (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.
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
- Choose File > Scripts > Open scripts folder. It opens the
Data\scriptsfolder of the portable profile. - Put
.lua(or JavaScript.js) files there. - Choose File > Scripts > Rescan scripts. Rescan again after editing a script; Lua source is read at scan time.
- 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.transactioncan be nested. On error it restores the changes in place and keeps existing object handles; catch the error withpcallto 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
| Context | app.isUIAvailable | Dialogs | app.editor | Timer and events |
|---|---|---|---|---|
File > Scripts, or pixel_lua_ui | true | modal | available | no |
Headless MCP pixel_lua_run | false | Dialog() returns nil | nil | no |
| Installed extension in the editor | true | modal and modeless | available | yes |
Headless plugin session (pixel_plugin_*) | false | nil | nil | no |
Batch CLI --script | false | fail | nil | no |
Limits
| Item | Limit |
|---|---|
| Execution time | 5 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 memory | 64 MiB |
| Script source | 4 MiB |
| Image size | 16,777,216 pixels per image (host buffers are outside Lua's memory) |
| Document | 2,048 frames, 512 raster layers |
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
| Name | Forms |
|---|---|
app | The host object (below). |
Sprite | Sprite(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. |
Image | Image(w, h[, colorMode]), Image{…} or an ImageSpec, Image(image) (clone), Image(image, rect) (crop), Image(sprite) (composite of frame 1). |
Color | Color(), 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, Rectangle | Point(x, y); Size(w, h); Rectangle(x, y, w, h), Rectangle(point, size), table forms. Values are rounded to integers. |
ImageSpec, Grid | ImageSpec{width, height, colorMode, transparentColor}; Grid{origin=Point, tileSize=Size} (default 16×16). |
Palette | Palette([n=256]) (up to 65,536), Palette(palette) (copy). |
Selection | Selection(), Selection(rect), Selection(selection). |
Dialog | See Lua dialogs. Returns nil without UI. |
Timer | Installed extensions only. See Timers and events. |
Constants
| Table | Members |
|---|---|
ColorMode | RGB, GRAY, INDEXED, TILEMAP |
BlendMode | NORMAL, 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 |
AniDir | FORWARD, REVERSE, PING_PONG, PING_PONG_REVERSE (there is no AnimationDirection table) |
FlipType | HORIZONTAL, VERTICAL |
RangeType | EMPTY, LAYERS, FRAMES, CELS, COLORS, TILES, SLICES |
MouseButton | NONE, LEFT, RIGHT, MIDDLE, X1, X2 |
MouseCursor | ARROW, CROSSHAIR, HAND, MOVE, SIZE_NS, SIZE_WE, SIZE_NWSE, SIZE_NESW, NO, IBEAM |
app
| Member | Description |
|---|---|
app.sprite / activeSprite | Active sprite; assignable. |
app.layer / activeLayer | Active layer or group; accepts a Layer or a layer name. |
app.frame / activeFrame | Active 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.bgColor | Foreground 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.pixelColor | rgba, rgbaR, rgbaG, rgbaB, rgbaA, graya, grayaV, grayaA, tile, tileI, tileF |
app.events | Installed extensions only. See Timers and events. |
Sprite
| Kind | Members |
|---|---|
| Properties | width, 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) |
| Layers | newLayer(), newGroup(), deleteLayer(layer | name) (a group deletes its children; the last layer cannot be deleted) |
| Frames and cels | newFrame([n | frame]) (copy), newEmptyFrame([n]), deleteFrame([frame]), newCel(layer, [frame], [image], [position]), deleteCel(cel) or deleteCel(layer, frame) |
| Whole sprite | resize(w, h) (nearest neighbor), crop(rect), flatten(), setPalette(palette), close() |
| Tags and slices | newTag(from, to), deleteTag(tag | name), newSlice([rect]), deleteSlice(slice | name) |
| Tilesets | newTileset(grid | rect | tileset, [count]), deleteTileset(tileset | n), newTile(tileset, [index]), deleteTile(tile) or deleteTile(tileset, index) |
| Precision | setPrecision('uint16' | 'float32' | 'uint8') (see Precision) |
Layer, Frame and Cel
| Object | Members |
|---|---|
| Layer | sprite (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) |
| Frame | sprite, frameNumber, cels, previous, next (all r), duration (seconds, up to 65.535) |
| Cel | sprite, 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
| Kind | Members |
|---|---|
| Properties (r) | width, height, id, version, colorMode, bytesPerPixel, rowStride, bounds, spec, precisionMode |
| Pixels | getPixel(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 image | clear([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
| Object | Members |
|---|---|
| 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. |
| Selection | bounds (r), origin, isEmpty (r), contains(point | x, y), select, add, subtract, intersect (rectangle or selection), selectAll(), deselect(). The editor receives the final mask. |
| Range | sprite, 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
| Object | Members |
|---|---|
| Tag | sprite, frames (r), fromFrame, toFrame, aniDir, repeats (0–65535), name, color, data, properties (r) |
| Slice | sprite (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) |
| Tile | index (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),mousePosandspritePos(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.Pointsupports==,+,-;RectanglehasisEmpty,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) andgetPixelFloat/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
| Group | Commands and parameters |
|---|---|
| Structure | NewLayer{name=}, NewFrame, NewEmptyFrame, RemoveLayer, RemoveFrame, FlattenLayers, DuplicateLayer (layers, tilemap layers and whole group trees), DuplicateSprite{ui=false, filename=, flatten=} (flatten needs RGB), ReverseFrames |
| Geometry | Flip{orientation='horizontal' | 'vertical'} (whole active cel), CanvasSize{width=, height=}, SpriteSize{width=, height=} |
| Pixels and selection | Clear (honors the selection), Fill (foreground color, keeps native indices; not on tilemap layers), SelectAll, MaskAll, DeselectMask, InvertMask |
| Cels | ClearCel, LinkCels, UnlinkCel (use the selected frames and layers; skip locked layers), CelOpacity{opacity=0..255} |
| Layer state | LayerOpacity{opacity=0..255} (image layers), LayerVisibility, LayerLock (toggle; can target groups or a layer range) |
| Navigation | GotoFirstFrame, 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.
| Widget | Fields | Value in data | Callbacks |
|---|---|---|---|
label | text | string | – |
entry | text | string | onchange (on commit) |
number | text, decimals | number | onchange |
slider | min (0), max (100), value | integer | onchange, onrelease (on commit) |
check, radio | text, selected (consecutive radios form a group) | boolean | onclick |
combobox | options, option | string | onchange |
button | text, focus (default button) | true for the clicked button | onclick; without one, a click closes the dialog |
color | color | Color | onchange |
shades | colors (up to 256), mode ('pick' or 'sort') | ordered Color list | onclick (ev.color, ev.button) |
file | title, filename, basepath, open, save, entry, filetypes | path string | onchange |
canvas | width, height (1–1024), autoscaling, mousecursor, onpaint | – | mouse and key callbacks (below) |
tab, endtabs | tab{id, text, onclick}; endtabs{id, selected, onchange} | selected tab id | onclick, onchange (ev.tab) |
separator, newrow | text (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.
Shades and file controls
shadesin pick mode callsonclickwith the clicked color and mouse button. In sort mode you reorder colors by dragging or Alt+←/→;dataholds the new order.modify{colors=…}replaces the list.fileopens the native single-file open or save chooser.entry=trueallows typing the path;open=falseneedssave=true; up to 32filetypes. The chosen path goes intodataand runsonchange. 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()
| GraphicsContext | Members |
|---|---|
| Properties | width, height (r), color, opacity (0–255), strokeWidth, blendMode (all blend modes except subtract and divide), antialias (only true) |
| State and paths | save(), restore(), beginPath(), closePath(), moveTo, lineTo, cubicTo, rect, oval, roundedRect(r, rx[, ry]), clip(), stroke(), fill() |
| Drawing | strokeRect, 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 andrepaint()repaints them. - Mouse callbacks
onmousedown,onmouseup,onmousemove,ondblclick,onwheelgetx,y(canvas coordinates),button,pressure,deltaX,deltaYandaltKey,ctrlKey,shiftKey,metaKey,spaceKey. Key callbacksonkeydown,onkeyupgetkey,code,repeatCountand 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.
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
.luafile, apackage.json(directory package), a.zipor an.aseprite-extension. The source is validated, then copied toData\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
exitand 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" }] }
}
namemust start with a letter or digit and may contain letters, digits,.,_and-(up to 128 characters);versionis required. A standalone.luagets a generated manifest with version0.0.0.- Only
contributes.scriptsis 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.
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
| Member | Description |
|---|---|
name, displayName, version, path (r) | From the manifest; path is the installed folder. |
preferences | A 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.spriteand 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,closeandonclosework 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
onclickrather thanonchangefor check boxes and radio buttons in modeless dialogs. - Open windows are not restored after a reload.
bounds can position and size a dialog.Timers and events
Timer{interval=seconds, ontick=fn}withstart(),stop()and read-onlyintervalandisRunning. 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)oroff(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.
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.
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.{…} 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 valueor--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-toand--color-modeact on every input opened so far;--palette,--scriptand an untemplated--save-asact on the latest input. - Output settings (trim, crop, slice, filename format, ignore empty) apply to
--save-asoperations 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
| Option | Argument | Meaning |
|---|---|---|
| FILE | path | Opens 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) | NAME | Input: include only this layer or group; repeatable; accepts group/name paths and * wildcards. |
--ignore-layer | NAME | Input: exclude a layer or group; repeatable. |
--all-layers | – | Input: include hidden layers (reference layers are always excluded). |
--tag (--frame-tag) | NAME | Input: only this tag's frames, in the tag's direction. |
--frame-range | FROM,TO | Input: 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-as | FILE | Saves the latest input, or every open input when FILE contains tokens. Captured at this point in the command line. |
--scale | FACTOR | Nearest-neighbor resize (fractions allowed). |
--shrink-to | W,H | Shrinks to fit inside W × H, keeping proportions; never enlarges. |
--palette | FILE | Replaces 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-mode | rgb | grayscale | indexed | Converts all inputs opened so far. |
--dithering-algorithm | none | ordered | old | error-diffusion | Used by a following --color-mode (default none). |
--dithering-matrix | bayer2x2 | bayer4x4 | bayer8x8 | Default bayer8x8. |
--script-param | name=value | A string parameter for following scripts (app.params). |
--script | FILE.lua | Runs 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. |
--crop | x,y,w,h | Crop rectangle. |
--slice | NAME | Output only that slice's area, per frame. |
--ignore-empty | – | Drop fully transparent frames. |
--filename-format | TEMPLATE | Output file names for --save-as, or frame names in the JSON data. |
--sheet | FILE.png | One sheet combining all inputs. |
--data | FILE, or empty | JSON metadata; --data= prints it to the console. Without --sheet only metadata is written. |
--format | json-hash | json-array | Data layout (default json-hash). |
--sheet-type | horizontal | vertical | rows | columns | packed | Default rows. --sheet-pack is the same as packed. |
--sheet-width, --sheet-height, --sheet-columns, --sheet-rows | integer | Fixed sheet size or count per line. |
--border-padding, --shape-padding, --inner-padding | integer | Space 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-format | TEMPLATE | Names 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
| Option | Reason given |
|---|---|
--shell | Interactive Lua REPL is not implemented; use --script. |
--play-subtags | Nested tag playback with independent repeats is not yet implemented. |
--debug | The reference desktop debug-log mode is not implemented; use --verbose. |
--noinapp | This local application has no Steam integration. |
- Saving to
.ase,.asepriteor.pforgeis 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. --previewchecks 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.
| Area | Default keys |
|---|---|
| Files | Ctrl+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 |
| Edit | Ctrl+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 |
| Select | Ctrl+A, Ctrl+D, Ctrl+Shift+D, Ctrl+Shift+I, Enter commit, Esc cancel |
| View | 0 fit, # pixel grid, Ctrl+' tile grid, Shift+' snap, F3 onion skin, F7 preview, Ctrl+F7 preview follow, Ctrl+Tab next tab |
| Sprite | Ctrl+P properties, Ctrl+Alt+I sprite size, Ctrl+Alt+C canvas size |
| Layers | Shift+N new, Ctrl+J via copy, Ctrl+Shift+J via cut, Shift+P properties, F2 rename, Ctrl+E merge down, Alt+↑/↓ select |
| Frames | Alt+N, Alt+Shift+N, Alt+C, Alt+I, Alt+P, Alt+L, Alt+T; Space play, ←/→ (or ,/.), Home, End |
| Filters | Ctrl+I invert, Ctrl+U hue/saturation |
| Brushes and colors | [/] size, Alt+1…9 recall slot, Ctrl+Alt+1…9 save slot, X swap colors |
| Other | Ctrl+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.apiVersionis0. 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
pixel_guide— the repair workflow and anatomy rules; read first.pixel_knowledge— pixel-art knowledge base by topic.pixel_analyze— size, fake-pixel grid, palette, ramps, outline, symmetry, issues.pixel_view— zoomed render with grid and rulers.pixel_view_grid— palette-index text grid with legend.pixel_get_ascii— exact text map of a region.pixel_compare— two images side by side.pixel_critique— SHIP/FIX critique with coordinates.pixel_export_checked— export only after inspections and a SHIP verdict.pixel_find_parts— detected hands, feet and eyes.
Draw and edit
pixel_create— new canvas.pixel_draw— drawing operations with the editor engine.pixel_set_pixels,pixel_set_ascii— set pixels or a text map.pixel_select— build and preview a selection.pixel_copy_region,pixel_mirror— copy or mirror regions.pixel_transform— RotSprite rotation, flips, scaling, crop, trim, shift.pixel_undo— restore the previous snapshot.pixel_open_in_app— open a file in the running editor.pixel_indexed_edit— exact palette-index painting and slot edits.pixel_reference_cel— inspect or set reference-image bounds.pixel_properties_info,pixel_properties_edit— typed properties.pixel_external_tilesets— resolve and embed external tilesets.pixel_tile_copy,pixel_tile_paste— native tile clipboard files.project_info,project_edit,project_color_mode,project_convert,project_view_frame— layers, groups, tilemaps, color mode, conversion and frame previews of sprite projects.
Repair and clean
pixel_detect_grid,pixel_repair_grid— find and repair the pixel grid.pixel_cleanup— orphans, outline, pixel-perfect, background, alpha and color merges.pixel_auto_repair— anatomy auto-repair with open items.pixel_parts,pixel_stamp_part,pixel_draw_limb— procedural parts and limbs.pixel_pixelize— image to pixel art.pixel_texture_rip— perspective texture rip.fx_detect_scale,fx_cleanup_extra,fx_pixelpipe,fx_apply_recipe— pixelpipe cleanup and recipes.fx_filter,fx_transform,fx_variants— filters, whole-sprite transforms, palette-swap variants.style_study,style_save,style_list— style library cards.
Palettes, color and precision
pixel_palette— extract, apply, swap, reduce, list presets.palette_ramp,palette_file,palette_from_reference,palette_used— ramps, palette files, reference palettes, used colors.pixel_color_profile— inspect, assign, convert or preview profiles.pixel_precision,pixel_precision_export— exact 16-bit/float edits and PNG16/EXR export.
Animation, slices and tiles
anim_view,anim_fix,anim_validate— view, fix and check frames.anim_generate,anim_action,anim_walk_cycle,anim_auto_puppet,anim_fx— generators, timing presets, walk cycles, puppets, squash and impact.anim_autoslice,anim_align_ground,anim_build_sheet,anim_export_gif— sheets and GIFs.lpc_place,lpc_export— LPC sheets.slices_edit,slices_export— slices and 9-slice renders.autotile_generate,tileset_extract,tilemap_render— autotile sets, tileset extraction, map rendering.
Art as code, import and export
spec_render,spec_template— sprite specs.pxl_build,pxl_ascii,pxl_list,pxl_to_project— PXL builds.pxl_lighting,pxl_normals,pxl_glow,pxl_shade— lighting, normal maps, glow and ramp shading on images.io_export,io_sheet— Export As and sprite sheets, with APNG reports.io_import_sheet,io_import_sequence— sheet and sequence import.io_batch— run a recipe over files.
Lua and extensions
pixel_lua_capabilities— supported Lua objects, commands and limits.pixel_lua_run— run Lua headless on a file.pixel_lua_ui— run, begin, poll or cancel Lua in the editor.pixel_plugin_inspect,pixel_plugin_open,pixel_plugin_invoke,pixel_plugin_status,pixel_plugin_save,pixel_plugin_close— headless extension sessions.pixel_plugin_ui— extensions and modeless dialogs in the editor.
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,.asepriteor.pforge. Save as.isbspriteor 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.exeopens as a command line instead of the appELECTRON_RUN_AS_NODEis still set in that window. RunRemove-Item Env:\ELECTRON_RUN_AS_NODEor 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.
| Tab | What it does |
|---|---|
| 01 PSX Converter | Resizes, 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 Editor | Texture 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 Studio | Layers, rectangular selections, shared palettes, frame animation, texture atlases, GLB/OBJ scene export and autosave recovery. See Advanced Studio. |
| Local assets | Finds images in a local folder or in the project asset shelf. See Local assets. |
| 05 Textures Animator | Turns pictures or video into editable frame timelines and exports WebM, MP4, GIF or PNG sequences. See Texture animation. |
| 06 Seamless | Makes a texture tile cleanly or blends up to four materials into one seamless material with derived maps. See Seamless materials. |
| 07 Dimensionner XC2 | Terrain generation, sculpting, independent vertex channels, two UV sets, roads, rivers, foliage, baking and Godot/Blender bundles. See Terrain sculpting. |
| 08 Library & History | Folders, tags, favourites, duplicate detection and project version history. See Library and history. |
| 09 Image Cloner | Restyles an image while keeping its composition, and exports metadata-free PNGs. See Image restyling. |
| 10 Pixel 2 Pixel | Cleans and upscales pixel art into smooth illustrations, with background removal, palette matching, recipes and SVG tracing. See Pixel 2 Pixel. |
| 11 Sprite Extractor | Splits 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.
.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
| Panel | Control | Options and range |
|---|---|---|
| Texture size | Size list | 16 × 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). |
| Aspect | Square or Match source (the longer side gets the chosen size). | |
| If not square | Stretch, Fit and pad, Fill and crop. | |
| Color depth | Depth buttons | 4-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 transparent | Reserves palette index 0 for transparency. | |
| Dithering | Pattern | Off, Bayer 2 × 2, Bayer 4 × 4 (default), Bayer 8 × 8, Floyd–Steinberg, Random noise. |
| Strength | 0–200 %, default 100 %. | |
| Image adjust | Brightness, Contrast, Saturation | −100 to 100, default 0. Reset adjustments returns all three to 0. |
| Lighting & palette | Even out lighting | 0–100, default 0. Removes broad shading so one bright corner does not use up the palette. |
| Palette focus | Spread evenly, Favour detail, Favour gradients. | |
| Tiling | Seamless edges | Off, Blend edges, Mirror (mirrors the texture onto itself, which tiles perfectly at the cost of symmetry). |
| Blend width | 2–45 %, default 12 % (shown with Blend edges). | |
| Preview as 3 × 3 tiles | Repeats 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.
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.
| Button | Result |
|---|---|
| Download PNG batch ZIP | One ZIP with every queued image converted to PNG. |
| Download TIM batch ZIP | One ZIP with every queued image converted to .TIM. |
| Convert & save all PNGs | Converts each image and asks where to save each result. |
| Convert & save all TIMs | As above, for .TIM. |
| Clear queue | Empties 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).
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
.TIMexport.
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
| Key | Action |
|---|---|
| B / E / G / I / L / R | Brush / Eraser / Fill / Pick colour / Line / Rectangle. |
| [ / ] | Smaller / larger brush. |
| Ctrl+Z, Ctrl+Shift+Z or Ctrl+Y | Undo / redo painting. In Edit scene mode, unless the pixel canvas has focus, they undo and redo scene edits. |
| Delete | In Edit scene mode with the 3D view focused, removes the selected object. |
| Esc | Cancels a pending prop placement. |
| Drag / right-drag or Shift-drag / scroll | 3D 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).
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.zipwithtiming.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.
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.
| Panel | Controls |
|---|---|
| TWO SOURCE MATERIALS | Material A and Material B (library or built-in materials, or Upload A/Upload B), Blend both materials (on), Swap A / B. |
| MATERIALS C & D | Blend 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 & BLEND | Output 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 PREVIEW | View: 3 × 3 seamless repeat, Single texture, Blend mask, Normal map, Height map, Roughness map. PSX preview, Tile boundaries. |
| PAINT THE TRANSITION | Paint 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 & HEALING | Patch 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 OUTPUT | An 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
| Control | Options and range |
|---|---|
| Action | Orbit / 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. |
| Strength | 1–100, default 30. |
| Tint colour, Channel value | Colour 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 channel | Fills 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.
| Button | Output |
|---|---|
| Save terrain / Open terrain | dimensionner-xc2.json: editable geometry, materials, paths and foliage. |
| Heightmap PNG | xc2-heightmap.png. |
| Vertex masks PNG + data ZIP | xc2-vertex-masks.zip. |
| Export Godot + Blender bundle | dimensionner-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 PNG | dimensionner-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-001and 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.
| Setting | Options and defaults |
|---|---|
| Extraction method | Regular grid or Separate shapes by transparency. |
| Grid | Cell 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). |
| Shapes | Connected 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 & TRANSPARENCY | Trim 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.
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.
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.jsonwith 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
| Format | Import | Export | Where |
|---|---|---|---|
| PNG, JPEG, WebP, GIF, BMP, AVIF and other decodable images | Yes | PNG everywhere; JPEG and WebP in Pixel 2 Pixel | All tabs |
PlayStation TIM (.tim) | No | Yes (4-bit, 8-bit, 16-bit) | PSX Converter |
| SVG | Converter source only | Pixel 2 Pixel (exact shapes or traced curves) | Converter, Pixel 2 Pixel |
| OBJ | Texture Editor (under 12 MB), Dimensionner XC2 | OBJ + MTL + textures ZIP | Texture Editor, Advanced Studio |
glTF binary (.glb) | No | Textured scene; terrain and foliage; per-chunk GLBs | Advanced Studio, Dimensionner XC2 |
| Video (MP4, MOV, WebM and others) | Yes | WebM, MP4 with audio, animated GIF | Textures Animator |
| Audio | Soundtrack from audio or video files | Inside MP4/WebM | Textures Animator |
| Godot scene and shader, Blender script | No | Engine bundle ZIP | Dimensionner XC2 |
| JSON documents | Project, animation, terrain, settings, palette, recipe | Same | Various |
| ZIP | No | Batches, sprite sheets, atlases, material maps, bakes, chunks | Various |
MCP tools
Textures & terrain has no tool group of its own. Drive it with the generic workspace tools, using the workspace ID texture:
workspace_commands— lists every setting, action, range, option and file control in the Texture Studio tabs.workspace_execute— sets named settings and runs a named action;out/outDircapture save dialogs and downloads.workspace_import— feeds local images, videos, soundtracks, OBJ files or project files into a file control.workspace_file_job— inspects and finishes a pending export capture.workspace_save/workspace_open— save and restore the complete Texture Studio state as JSON.studio_workspace_state— reads or replaces the state through the structured adapter.studio_capture— captures the editor for visual checks.workspace_game_preset_apply— applies a game style (render resolution, lighting, fog and PS1 effects of the Texture Editor scene).
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
- 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.
- Choose a Processing profile (see Processing profiles) and adjust the map controls in the sidebar. Every change regenerates the maps.
- Switch the view with the tabs above the preview: Lighting, Source, Normal, Height, Specular, Occlusion, Parallax.
- On the Lighting view, drag across the preview to move the selected light.
- 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
| Profile | Use 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 controls | The 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.
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.
| Control | Range | Default |
|---|---|---|
| Detail height | 0–4000 | 250 |
| Detail softness | 0–40 | 6 |
| Edge height | 0–4000 | 100 |
| Edge distance | 0–255 | 60 |
| Edge softness | 0–40 | 10 |
| Rounded bevel | on/off | on |
| Tile neighborhood | on/off | off |
| Invert normal X, Invert normal Y | on/off | off |
| Depth mode | binary, height, quantization, intervals | binary |
| Depth threshold | 0–255 | 140 |
| Depth focus | 0–50 | 2 |
| Depth softness | 0–50 | 3 |
| Binary minimum height | 0–255 | 0 |
| Binary dilation / erosion | −99 to 99 | 1 |
| Height depth brightness | −255 to 255 | 0 |
| Height depth contrast ×1000 | 1–4000 | 1000 |
| Invert depth | on/off | off |
| Quantization (source pass-through) | 1–255 | 1 |
| Specular softness | 0–50 | 3 |
| Specular brightness | −255 to 255 | 0 |
| Specular contrast ×1000 | 1–4000 | 1000 |
| Specular pivot | 0–255 | 127 |
| Invert specular | on/off | off |
| Occlusion softness | 0–50 | 3 |
| Occlusion brightness | −255 to 255 | 16 |
| Invert occlusion source | on/off | off |
| Occlusion threshold / pivot | 0–255 | 1 |
| Occlusion contrast ×1000 | 1–4000 | 1000 |
| Occlusion distance | 0–1024 | 10 |
| Occlusion distance mode | on/off | on |
| Normal alpha option, Specular alpha option, Occlusion alpha option, Depth alpha option | on/off | off |
| Alpha output behavior | Reference byte layout, Preserve transparency | Reference byte layout |
- Depth mode
quantizationandintervalspass 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.
| Group | Control | Range | Default |
|---|---|---|---|
| General | Grayscale conversion | perceptual, integer | perceptual |
| Byte quantization | round, truncate | round | |
| Preserve source alpha | on/off | on | |
| Inner details | Normal strength | 0–20 | 4 |
| Smoothing radius | 0–6 | 1 | |
| Height contrast | 0.1–4 | 1 | |
| Height gamma | 0.1–4 | 1 | |
| Occlusion radius | 1–32 | 8 | |
| Occlusion strength | 0–8 | 2 | |
| Specular strength | 0–2 | 0.6 | |
| Specular contrast | 0.1–5 | 1.5 | |
| Invert normal X, Invert normal Y, Invert height, Seamless edges, Height from transparency | on/off | off | |
| Silhouette bevel | Edge height | 0–20 | 0 |
| Edge distance | 1–64 | 8 | |
| Edge softness | 0–6 | 0 | |
| Edge profile | spherical, linear | spherical | |
| Specular tuning | Brightness | −1 to 1 | 0 |
| Threshold | 0–1 | 0.5 | |
| Softness | 0–6 | 0 | |
| Invert specular | on/off | off | |
| Independent depth map | Depth source | height, binary | height |
| Binary threshold | 0–1 | 0.5 | |
| Focus | 0–6 | 0 | |
| Depth softness | 0–6 | 0 | |
| Minimum depth | 0–1 | 0 | |
| Dilate / erode | −8 to 8 | 0 | |
| Depth brightness | −1 to 1 | 0 | |
| Depth contrast | 0–5 | 1 | |
| Invert depth | on/off | off | |
| Occlusion tuning | Occlusion mode | horizon, grayscale, distance | horizon |
| Darkness spread | 1–64 | 8 | |
| Occlusion brightness | −1 to 1 | 0 | |
| Occlusion contrast | 0–5 | 1 | |
| Occlusion threshold | 0–1 | 0.5 | |
| Occlusion softness | 0–6 | 0 | |
| Invert occlusion | on/off | off |
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:
- Switch to the map tab you want to correct: Source (diffuse colour), Normal, Height, Specular, Occlusion or Parallax. The Lighting view cannot be painted.
- 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. - 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.
| Control | Range | Default |
|---|---|---|
| Position | Drag on the Lighting view | — |
| Light height | −128 to 128 | 0.6 |
| Intensity | 0–4 | 1 |
| Specular intensity | 0–4 | 1 |
| Shininess | 1–128 | 24 |
| Light color, Specular light color | Colour | White |
| Animate selected light, Light angular speed | on/off; −8 to 8 | off; 1 |
| Ambient, Ambient color | 0–1; colour | 0.25; white |
| Preview background | Colour | #141b25 |
| Preview parallax | 0–0.3 | 0 |
| Map / source blend | 0–1 | 0 |
| Toon preview, Toon levels | on/off; 2–8 | off; 3 |
| Pixelated preview | on/off | on |
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.isbmaterialwith 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).
.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
| Format | Import | Export |
|---|---|---|
| Source image | Image file or selected project asset, up to 16 megapixels | — |
| Map PNGs (normal, height, specular, occlusion, parallax, lit preview) | As custom bases or preview maps | Yes |
.isbpreset / .gbpreset | Yes | .isbpreset |
| Laigter preset text | Yes | No |
.isbmaterial / .gbmaterial | Yes | .isbmaterial |
| Laigter project ZIP | Yes | No |
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.
| Control | Shortcut | Action |
|---|---|---|
| Find a control | Ctrl+K | Searches 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. |
| Tabs | Alt+1–4 | Switch to editor 1–4. Arrow keys, Home and End also move between focused tabs. |
| Hide panels / Show panels | Alt+F | Hides 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. |
| — | Esc | Closes 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.
- Choose a Game style: Retro platformer, Fantasy RPG, Dungeon crawler, Sci-fi shooter, Survival horror, Stealth, Cozy simulation, Strategy / tactics, Racing or Puzzle / adventure.
- Enter a Seed (default
gamebench-1, up to 128 characters). - Press Generate game preset. The active editor's map is replaced; the other editors keep their work.
- 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.
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
| Section | Controls (defaults) |
|---|---|
| Map | Town 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 model | Terrain 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. |
| Settlement | Type (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). |
| Streets | Main 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). |
| Region | Setting (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. |
| Sheet | Style (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. |
| Colours | Main 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
| Group | Tool (key) | Use |
|---|---|---|
| Sculpt | Raise (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). |
| Roads | Road (R) | Click control points; right-click or Enter finishes, Backspace removes the last point, Esc cancels. Types: Highway, Street, Lane, Dirt road, Trail, Railway. |
| Objects | Select (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. |
| Air | Fog (G) | Paints ground fog, smoke or gas. |
| Notes | Arrow (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. |
| Edit | Measure (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
| Group | Tools |
|---|---|
| EDIT | MOVE, 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 & PASSAGES | DOOR, SEALED, ONE-WAY, BREACH, WINDOW, BREAKABLE WIN., SECRET, LINKER, WALL, LIGHT WALL, THIN WALL, ROTATE WALL, ERASE WALL. |
| STYLE | BUCKET (room fill colour), HIGHLIGHT, TINT, with swatches and a custom colour. |
| RED PEN | SCRIBBLE, CIRCLE, UNDERLINE, SCRATCH OUT, ARROW, CROSS OUT, ? MARK, ! MARK, TICK. |
| MARKS | STAIRS, 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 / TOWN | WATER, 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. |
| WIPE | CLEAR 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.
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.
| Editor | Export menu entry | File |
|---|---|---|
| Town Generator | Map image | PNG at the chosen export resolution |
| Editable town setup | <name>.isberg-town.json | |
| PSX Builder | 3D model | psx-building.obj + psx-building.mtl (keep them together) |
| Viewport screenshot | psx-building.png | |
| Town plan image | town-map.png (street and district scenes) | |
| Vector town plan | town-map.svg (street and district scenes) | |
| Terrain Studio | Editable 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 Designer | 3D model screenshot | isberg-floorplan-3d.png (while the 3D model is open) |
| Full chart image | survey_chart_…_<seed>.png | |
| Single floor image | PNG of the chosen level, with or without paper | |
| Editable floor plan | survey_layout_<seed>.json (all levels and placed items; IMPORT (JSON) restores it) |
.isbtiles tile models, see Tile modeler; for playable levels, see Level & playtest.MCP tools
world_editor— activatetown,buildings,terrainorfloorplan.world_editor_state— read or replace one editor's complete native state.world_generate— run the editor's generator with its current settings, optionally after replacing its state.workspace_game_presets/workspace_game_preset_apply— list and apply game styles as an undoable operation.workspace_save/workspace_open— save or restore all initialized subeditors (workspace IDmaps).workspace_commands/workspace_execute— discover and run named controls and captured exports; pass aframeselector to reach a subeditor.
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.
| View | Purpose |
|---|---|
| Tiles, UVs & painting | The tile editor described in this chapter. |
| Scene, rig & animation | The full 3D scene editor on the same scene: transforms, rigs, clips and acts. See 3D scene & animation. |
| Vertex paint | The scene-aware Vertex painter on the same scene. See Vertex painter and Scene targets. |
| Import & export | Format 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.
| Control | Options |
|---|---|
| Tool | Draw (stamp the selected atlas tile), Select faces, Edit vertices (drag the corner nearest the click), Erase, Paint color. |
| Plane | Floor · X/Z, Wall · X/Y, Wall · Y/Z. |
| Layer | The plane's offset along its normal axis, in whole steps (default 0). |
| Grid | Tile size and snap, 0.125–16 units (default 1). |
| Color | Colour for new tiles, Paint color, Paint selected and texture painting. |
| Paint vertex | All corners or Corner 1–Corner 4. |
Mouse and keyboard
| Input | Action |
|---|---|
| Left-click / left-drag | Apply the current tool. Drawing on an occupied cell selects that tile instead. |
| Ctrl+click | Add or remove a face from the selection (Select faces, Edit vertices). |
| Right-drag | Erase tiles with any tool. |
| Middle-drag | Pan. |
| Space+left-drag / Space+right-drag / Space+middle-drag | Orbit / pan / zoom. |
| Wheel | Zoom. |
| Tab | Toggle between Draw and Select faces. |
| W A S D | Move 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 / E | Rotate the selection −90° / +90° around the plane's axis, pivoting on the crosshair. |
| Ctrl+A / Ctrl+C / Ctrl+V | Select all / copy / paste tiles. |
| Delete | Delete the selected tiles. |
| Ctrl+Z / Ctrl+Shift+Z | Undo / 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).
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
uorv, 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
| Button | Result |
|---|---|
| Save | model.isbtiles: the complete editable scene, with atlases, tiles, colours and retained source metadata. |
| Open | Opens .isbtiles, legacy .gbtiles or a model JSON document. |
| New | Starts an empty model with the default atlas (undoable). |
| glTF | model.gltf with the atlas and vertex colours embedded. |
| OBJ | model.obj with geometry, UVs and vertex colours. |
| PNG | model-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.
.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, orpainted-scene.jsonin 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
| Control | Options and range | Default |
|---|---|---|
| Action | Paint brush, Eyedropper, Select vertex, Select triangle, Box mask, Circle mask, Lasso mask, Orbit view | Paint brush |
| Channel | Vertex RGBA, Normal vector | Vertex RGBA |
| Brush target | Vertex, Edge (distance to the nearest edge; both endpoints), Face (closest triangle point; all three corners) | Vertex |
| Shared records | Meshes: Shared positions or Independent face records (duplicates triangle corners so faces paint separately). Scenes: Retain scene records. | Shared positions |
| RGB color, Alpha | Colour; 0–1 | #ef9f69; 1 |
| Background / replace target | Colour used by Replace as the colour to find; Swap foreground / background exchanges the two | — |
| R G B A | Channel switches for brushes and colour actions | All on |
| Brush radius (world units) | 0.0001–10000 | Set by Fit |
| Opacity | 0–1 | 0.7 |
| Falloff | Smooth, Linear, Constant, Custom curve | Smooth |
| 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
| Button | Effect |
|---|---|
| Smooth normals | Corner-angle-weighted normals across coincident positions. |
| Hard normals | Face normals; only compatible coplanar records stay shared. |
| Auto smooth 60° | Smooths edges below a 60° angle and hardens the rest. |
| Generate tangents | Builds tangents from UVs (requires UVs). |
| Invert normals | Scene resources invert the vectors and keep winding; standalone meshes also invert winding. |
| Split triangle vertices | Gives each triangle corner its own record. |
| Merge compatible records | Merges coincident records. Standalone meshes average colours and keep the first UV; scenes keep seams where colour, UV or deformation data differ. |
| Invert winding + normals | Reverses 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#RRGGBBor#RRGGBBAAentries). 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.
Vertex painter keyboard and mouse
| Input | Action |
|---|---|
| Alt-drag or right-drag | Orbit. |
| Middle-drag | Pan. |
| Wheel / Ctrl+wheel | Zoom / change brush radius. |
| [ / ] | Resize the brush. |
| F1 / F2 | Colour channel / normal channel. |
| X | Swap foreground and background colours. |
| Shift+E | Eyedropper. |
| Ctrl+V / Ctrl+E / Ctrl+F | Brush target Vertex / Edge / Face. |
| Ctrl+Z / Ctrl+Shift+Z | Undo / redo. |
| Esc | Cancel the current stroke. |
Formats
| Format | Tile modeler | Vertex painter |
|---|---|---|
.isbtiles (legacy .gbtiles) | Open and save | — |
| Model / mesh JSON | Open | Open and export (meshes or complete scenes) |
glTF (.gltf) | Export, atlas and vertex colours embedded | — |
| OBJ | Export | Open and export with vertex colours (v x y z r g b a), normals and the first UV channel |
| PNG | Atlas import, view export | Swatch source, view export |
| Snapshot and swatch JSON | — | Open and save |
| GLB, DAE, FBX, PLY, STL, TMX, Crocotile files | Through Import & export (Formats & interchange) | — |
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.isbtilesdocuments.
Vertex painter (meshes)
mesh_create,mesh_info,mesh_export— create from a demo, OBJ or JSON; inspect; export coloured OBJ or JSON.mesh_paint— RGBA brush with channels, falloff curves and visibility filtering.mesh_normals— smooth, hard, auto, invert or paint normals; generate tangents.mesh_selection,mesh_selection_set— masks and named sets.mesh_topology— split or merge vertex records.mesh_color_action,mesh_swatches— fill, round, replace, randomize; swatch collections.mesh_snapshot,mesh_reimport,mesh_history— snapshots, safe reimport and reset, and up to 50 file revisions for undo and redo.
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.
scene_painter_open,scene_painter_info,scene_painter_targets— create a painter document, inspect it, choose targets.scene_painter_selection,scene_painter_paint,scene_painter_color— masks, world-space brushing and colour actions.scene_painter_normals,scene_painter_topology— normals, tangents and topology with dependent-stream remapping.scene_painter_snapshot,scene_painter_reset,scene_painter_preview— snapshots, reset to the original scene, posed preview.scene_painter_export,scene_painter_history— export the scene or painter document; list, undo and redo revisions.
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
| Input | Action |
|---|---|
| Right-drag, or Alt+left-drag | Orbit the view. Orbiting leaves an active scene camera and returns to the orbit view. |
| Middle-drag, or Shift+right-drag | Pan. |
| Mouse wheel | Zoom. |
| Left-click | Select an object, or a vertex, edge or face in component modes. Clicking near a bone origin selects the bone. |
| Shift+click / Ctrl+click | Add components to / remove components from the selection. |
| Left-drag with Move, Rotate or Scale | Transform the selected components, or the selected object, along the chosen local axis. |
| Frame | Centre 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.
- 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.
- 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.
- 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.
- 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.
- 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.
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
| Control | Effect |
|---|---|
| Split | Gives the selected faces their own vertices, so they can move apart. |
| Subdivide | Splits each selected triangle into four, with shared midpoint vertices. |
| Extrude | Pushes the selected region out by Distance (default 0.5) and adds boundary side walls. |
| Delete faces | Removes the selected faces. You cannot delete every face; delete the object instead. |
| Apply to vertices | Applies the transform fields to the selected vertices: position and rotation act as a delta and scale as a multiplier. |
| Vertex color + Paint selected vertices | Paints 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.
| Brush | What it places |
|---|---|
| Off | No painting; the viewport selects and transforms. |
| Tile | A snapped, textured quad on the chosen Plane (xz floor, xy wall, yz side), or on the picked face. |
| Block | A cube of six outward-facing quads. |
| Sticky edge | A 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
| Option | Default | Meaning |
|---|---|---|
| Size | 1 | Brush edge length. |
| Grid | 1 | World-space snap step for positions. |
| Hinge ° | 0 | Sticky hinge angle, −360 to 360, used by Hinge angle mode. |
| Sticky | Camera plane | Camera plane snaps the edge basis to the view axes and projects the pointer ray onto that plane; Hinge angle uses the explicit angle. |
| Keep aspect | Off | Keeps the width/height ratio, including UV quarter turns. |
| Normal size | Off | Restores the authored brush dimensions. Holding Shift while painting does the same. |
| Height | 1 | Sticky quad height. |
| Material | First material | Embedded scene material for new geometry. |
| UV X, Y, width, height | 0, 0, 1, 1 | Atlas rectangle in UV units (steps of 1/16). |
| Flip U, Flip V, Turn | Off, off, 0° | Mirror the atlas rectangle and rotate it by 0°, 90°, 180° or 270°. |
| XYZ | 0, 0, 0 | Position 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
| Primitive | Where | Notes |
|---|---|---|
| Cube | Toolbar, Add mesh | Six faces with UVs, size 1 m. |
| Plane | Toolbar, Add mesh | One quad on X/Z. |
| Sphere | Toolbar, Add mesh | UV sphere, 16 segments and 8 rings by default. MCP accepts 3–128 segments and 2–128 rings. |
| Cylinder | Toolbar, Add mesh | Capped, 16 segments by default. |
| Wedge | Additional primitives | Closed triangle mesh with UVs. |
| Cone | Additional primitives | Closed, segmented; Segments 3–128, default 16. |
| Textured tile | UVs & materials, Add textured tile | One 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.
| Control | Range / default | Effect |
|---|---|---|
| Background | Default #17202c | Scene background color. |
| Ambient | 0–10, default 0.65 | Ambient light strength. |
| Apply environment | Applies background and ambient. | |
| Light type | point, directional, spot, ambient | Kind of the selected light. |
| Light color, Intensity | Intensity 0–10,000, default 2 | Applied with Apply selected light. |
| Projection | perspective, orthographic | Kind of the selected camera. |
| FOV / size | FOV 1–179°, default 50; orthographic size default 10 | Applied with Apply camera. |
| View selected camera | Looks through the selected camera. | |
| Return to orbit view | Returns 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
.jsonand 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
- Build a bone hierarchy with Bone (select a bone first to add a child).
- Select the mesh and open Skeleton & weights.
- 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
- Select vertices in Vertices mode, or enter one Vertex index.
- Click Read to load that vertex's four slots.
- 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.
- Select the constrained object; for IK, select the chain's root bone.
- Choose a Constraint type and a Target object, or keep World position and type a World target (default
1,1,0). - 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.
- Set Weight (0–1) and optional Options JSON, then click Add constraint.
| Constraint | Behavior |
|---|---|
twoBoneIK | Analytic 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. |
chainIK | Iterative (FABRIK) chain IK over 2–64 contiguous parent-child joints. |
lookAt | Aims the object at the target. |
copyTransform | Copies the target's transform channels. |
limitRotation | Clamps rotation between minimum and maximum values. |
distance | Keeps a distance to the target. |
parent | Weighted 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
- Click Open source scene and choose a scene
.jsonwith the source skeleton and clips. - 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.
- 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.
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.
| Control | Effect |
|---|---|
| Billboard + Camera direction | The object faces against the view's forward vector. |
| Billboard + Camera position | The object faces the camera point. |
| Lock local Y | Turns only around the authored local up axis, including under a tilted parent. |
| Snap + angle | Quantizes 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 actions | Selects 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
- Select an object and set its transform fields (or its UV offset fields under UVs & materials).
- Choose a channel: Transform (position, rotation and scale together), Position, Rotation, Scale, Visibility or UV offset.
- Choose an interpolation:
LINEAR,STEPorCUBICSPLINE(cubic Hermite). - 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
- Click + Act (a 10-second act) and choose it in the act list (Clip playback plays plain clips).
- Choose a clip and select the object whose subtree it should drive.
- 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
- Select an object, type an action name and click New for selected object. Rename renames the chosen action.
- 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. - Enter Time and Value, choose the key's outgoing interpolation, and click Set key.
- 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
- Type a name and click New; Rename renames it. Assign to selected attaches the sequence to the selected object, which must have UVs.
- 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.
- 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
- Type a name and click New act.
- Choose a segment Type (3D action or UV sequence), an Action and an Actor (All actors or one object).
- Set start (default 0), duration (1), timescale (1; negative values play backwards), offset (0) and weight (1), and Loop segment.
- Click Add segment, or select a segment and click Update selected or Remove selected.
- 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
- Choose Saved curve (or New curve) and type a Name (1–100 characters, default
Custom ease). - Choose a Kind and set its fields. The graph previews the curve from 0 to 1 and shows its midpoint value.
- Click Save curve. Saved names appear in the action-key and weight-key interpolation lists.
| Kind | Fields | Rules |
|---|---|---|
| Cubic Bezier | x1, 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. |
| Polynomial | Coefficients, constant first (default 0, 0, 1) | 1–64 comma-separated numbers in ascending powers. |
| Sample keys | Time (0–1), Value, Set sample, Delete selected, Between samples (Linear or Step) | 2–100,000 keys on normalized curve time. |
| Steps | Steps (1–100,000, default 4), Jump at (End or Start) | |
| Formula | Formula (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.
| Target | Suggested properties |
|---|---|
material | color, opacity, roughness, metallic |
camera | fov, near, far, size, zoom |
light | color, intensity, range, angle |
node | visible, uv.offset, uv.scale |
custom | Any 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 plusanimation.jsonwith 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.
| Format | Import | Export |
|---|---|---|
Scene JSON (.json) | Yes | Yes (Save) |
Isberg tile project (.isbtiles, .gbtiles) | Yes | Through Formats & interchange or MCP |
| glTF 2.0 / GLB | Triangle 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/fan | Same, with embedded geometry and images; visibility/UV tracks, markers, acts and environment in application extras |
| OBJ + MTL | Polygons (triangulated), negative indices | Static snapshot of the evaluated visible scene with normals, UVs, vertex colors, MTL and texture sidecars |
Collada 1.4.1 (.dae) | Through Formats & interchange | Geometry, materials, hierarchy, cameras, lights, skin controllers and sampled transform clips; textures as sidecars |
| TMX | Finite orthogonal maps with uncompressed CSV layers | Floor tiles with one atlas; height levels become layers; other meshes are omitted and counted |
| Viewport PNG | Current view |
Limits
| Item | Limit |
|---|---|
| Vertices per mesh | 250,000 |
| Scene objects / meshes | 10,000 each |
| Animation clips | 1,000 |
| Keys per track | 100,000 |
| Hierarchy depth | 256 levels |
| Bones per skin | 256 |
| Influences per vertex | 4 |
| Rig constraints | 256 |
| Embedded texture | 96 MB, PNG or JPEG |
| Render job | 1,800 frames / 60 seconds; frame archive 256 MB |
| Editor undo | 60 steps |
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.
scene3d_create: create a local scene.scene3d_info: inspect objects, meshes, bones, skins, clips, acts and selection.scene3d_object: add, edit, delete, parent or instance objects, primitives and tiles.scene3d_select: select vertices, edges or faces (replace, add, subtract, intersect, all, invert).scene3d_geometry: split, subdivide, extrude, delete, transform, paint colors or transform UVs.scene3d_material: add, edit and assign materials; environment and active camera.scene3d_skin: bind, unbind, assign or paint weights, restore the bind pose.scene3d_animation: clips, keys with tangents, markers with payloads, acts and act items.scene3d_evaluate: evaluate transforms, skins and markers at a time; optionally save sampled animation.scene3d_prefab: save or instantiate subtree prefabs.scene3d_import: import OBJ, glTF/GLB, CSV TMX,.isbtilesor scene JSON.scene3d_export: export glTF/GLB, OBJ+MTL, Collada, floor-tile TMX or scene JSON.scene3d_open: open a scene in the running desktop.scene3d_render: render the running viewport to a frames ZIP or WebM (needs the desktop).scene3d_render_status: track or finish a render job.scene3d_modeling_info: inspect brush, billboard, mirror, root and slot capabilities.scene3d_brush_place: place or remove a tile, block or sticky quad.scene3d_modeling_primitive: add a wedge or cone.scene3d_modeling_behavior: billboards, local-Y lock, snapping, mirrors, directional UV sectors.scene3d_skeleton_root: bind a mesh or group to a skeleton root.scene3d_bone_display: bone display length and thickness.scene3d_influence_slots: set four bone/weight slots on vertices.scene3d_constraint: inspect, add, update or remove constraints.scene3d_retarget: retarget a clip with a bone map, root motion and translation scale.scene3d_rig_bake: bake constraints into a clip.scene3d_morph_weights: inspect or edit morph weights.scene3d_timeline_edit: action curves, UV sequences, segments, weight keys and camera switches.scene3d_native_channels: named curves and property targets.scene3d_native_info: inspect native actors, actions, UV frames and acts.scene3d_native_evaluate: evaluate native actions, choreography, UVs, cameras and billboards at a time.scene3d_native_edit: edit native records as validated structured data.scene3d_import_tile_project: import an.isbtilesor legacy tile project as an editable scene.scene3d_export_tile_project: export a complete.isbtilesdocument.shader_scene_material: attach a shader document to a scene material.interchange_export_live: export the running editor's state directly.runtime_workspace_project: convert a scene JSON into a native game project.studio_canvas,studio_click,studio_workspace_state: drive the open editor's viewport and controls through the desktop.
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.
| Template | Adds |
|---|---|
blank | Nothing else. |
platformer | Six rising, alternating platforms. |
landscape | A 9 × 9 field of terrain blocks at varying heights. |
interior | Four walls and a table. |
Game-style layouts
- Choose a Game style. Its description appears below the list.
- 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). - Click Generate game layout. The layout replaces the level as one undoable edit, and Check level runs automatically.
| Game style | Layout | Camera |
|---|---|---|
| Retro platformer | Rising jump platforms, safe landings, collectibles and a midpoint checkpoint. | Third person |
| Fantasy RPG | Village square, main road and an exploration pickup; return to the entrance to finish. | Third person |
| Dungeon crawler | Connected chambers, doorways, pillars, treasure and a key-gated exit. | Top-down |
| Sci-fi shooter | Symmetrical arena with cover, two flanking lanes and health pickups. | First person |
| Survival horror | Corridor with side rooms, safe-room checkpoint, exit key, limited sprint and optional torch. | First person |
| Stealth | Alternating sightline blockers, low cover, a crouch passage and a retrieve-and-return route. | Third person |
| Cozy simulation | Homestead, garden plots, paths, gathering pickups and a delivery goal. | Third person |
| Strategy | Mirrored bases, resource sites and a central objective, for map inspection. | Top-down |
| Racing circuit | Closed course with three ordered checkpoints before the finish, for on-foot route inspection. | Third person |
| Puzzle exploration | Three 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.
Placing and editing objects
Choose an Editor tool:
| Tool | Behavior |
|---|---|
select | Click an object in the viewport or the Objects tree to select it. |
place | Click a surface or the ground to place the Place item, snapped to Grid (default 1, minimum 0.1). |
move | Drag the selected object on its horizontal plane, snapped to the grid. |
erase | Click an object to delete it with its descendants. |
Right-drag orbits the editor camera and the wheel zooms.
Placeable items
| Place | Creates |
|---|---|
box | 1 m box. |
wall | Box 3 × 3 × 0.25 m. |
floor | Box 3 × 0.2 × 3 m. |
pillar | Cylinder 0.6 × 3 × 0.6 m. |
sphere | 1 m sphere. |
marker | Non-colliding marker, for spawns and references. |
light | Point light, intensity 1.5, range 12. |
table | Group with a top and four legs. |
stairs | Group 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
| Type | Use | Collides by default |
|---|---|---|
box, sphere, cylinder, plane | Primitives sized by Size. | Yes |
mesh | Indexed triangle geometry with normals, UVs, vertex colors and material data (color, roughness, metallic, texture), and optionally a shader material. | Yes |
group | Parent for compound props. | No |
marker, light, camera | Spawn points, lighting, cameras. | No |
unresolved | Placeholder 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.
| Component | Behavior in local playtest |
|---|---|
health pickup | Restores health by Pickup value (default 10), up to the maximum. Pickup radius 1 m. |
stamina pickup | Restores stamina by Pickup value, up to the maximum. |
collectible | Recorded by object ID when collected. |
checkpoint | Activates on approach (radius 1.5 m). Respawn returns here. |
goal | Completes on approach (radius 1.5 m). |
none | Removes 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.
| Setting | Sidebar label | Default | Range |
|---|---|---|---|
| Gravity | Gravity | 24 | 0–200 |
| Walk speed | Walk speed | 4 | 0.1–100 |
| Sprint speed | Sprint speed | 7 | 0.1–100 |
| Crouch speed | MCP only | 2 | 0.1–100 |
| Player height | MCP only | 1.7 | 0.2–5 |
| Crouch height | MCP only | 1.05 | 0.2–5, at most the player height |
| Player radius | MCP only | 0.28 | 0.05–2 |
| Step-up height | Step height | 0.4 | 0–2 |
| Jump speed | MCP only | 7 | 0–30 |
| Jumping | Jump enabled | On | |
| Start in noclip | MCP only | Off | |
| Stamina | Stamina enabled | On | |
| Stamina maximum / drain / recovery | MCP only | 100 / 28 / 18 | 1–10,000 / 0–1,000 / 0–1,000 |
| Health and fall damage | Health / fall damage | Off | |
| Health maximum / fall damage / safe fall speed | MCP only | 100 / 4 / 11 | 1–10,000 / 0–1,000 / 0–100 |
| Player torch | Player torch | Off |
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
- Clear Full engine playtest to use the local simulation.
- Choose a Camera and click ▶ Start playtest.
- Click the viewport to capture the mouse. Esc releases it.
- Click ■ Stop playtest to return to editing. The authored level is restored.
| Input | Action |
|---|---|
| W A S D or arrow keys | Move relative to your heading. |
| Mouse (captured) | Look. |
| Shift | Sprint; uses stamina when stamina is on (not in noclip). |
| C | Toggle crouch. You cannot stand up under a low ceiling. |
| Space | Jump when jumping is on; rise in noclip. |
| Left Ctrl | Descend in noclip. |
| N | Toggle noclip. Leave noclip in free space, not inside a collider. |
| F | Toggle the player torch (when enabled). |
| Respawn | Return 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.
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.
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.
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
- Click Choose project folder and select the folder.
- Choose one of the listed
.tscnscenes 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 content | Import behavior |
|---|---|
| Node hierarchy and transforms | Parent paths, names and local transforms (Transform3D, legacy Transform, position, rotation, rotation degrees, scale). Untouched imported matrices stay exact. |
| Primitive meshes | Box/Cube, Sphere, Cylinder and Plane. Capsules show as cylinders, with a warning. |
| Collision shapes | Box, 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. |
| CSG | Box, sphere and cylinder dimensions. Boolean operations are not evaluated. |
| Materials | Simple albedo color. |
| Lights and cameras | Point and directional lights, camera FOV and current state. |
| Spawn | A CreativeSpawn, PlayerSpawn or Spawn marker, otherwise the active or first camera. |
| External resources | Kept as unresolved descriptors; external scene, mesh and shape instances get visible placeholder objects. |
| Scripts, shaders, unknown properties | Kept as data. A single-scene import never runs them; a project import embeds supported sources so they run only when you playtest. |
.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
.jsonor.levellevel file. Opening resets the editor's undo history. - The level, editor camera, selection and player start are also saved with the
.isbergproject.
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
level_create: create a level from a template or a game style with seed, difficulty, scale and settings.level_inspect: read metadata, warnings, hierarchy, world transforms and collider bounds.level_object: add, update, duplicate or delete objects and components (radians).level_settings: edit controller settings and the spawn.level_history: undo or redo saved edits.level_import_tscn: import a text.tscn.level_import_project: import a scene with its referenced scripts and shaders from a project root.level_playtest: reset, inspect or step the local playtest (up to 1,200 steps per call) with typed input.level_preflight: run Check level and optionally write the report.level_export: write a history-free level.runtime_workspace_project: convert a level into a native game project, optionally running it.workspace_game_preset_apply: apply a game-style recipe to the open editor.
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
- 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. - If you selected more than one model file, choose the main file in the list that appears.
- 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
| Format | Import | Export |
|---|---|---|
| glTF / GLB | Meshes, materials, hierarchy, skins, clips, cameras, lights, morph targets (position, normal, tangent) and weight animation, Draco triangles and point clouds (including several buffers), standard POINTS | GLB · embedded, glTF · embedded, with morphs and weight curves |
| FBX | ASCII 7.x and binary (before and from 7500) with compressed arrays: polygon meshes, normals, UVs, colors, materials, transforms, skin clusters, TRS animation curves, blend shapes | FBX · 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 data | Collada with skeletal controllers and sampled animation |
| OBJ + MTL | Geometry, normals, UVs, vertex colors, materials, textures | OBJ + MTL, static evaluated snapshot |
| PLY | ASCII and binary little/big endian meshes and point clouds with positions, normals, colors and UVs | PLY in the same three encodings |
| STL | ASCII and binary facets | STL ASCII or binary |
| TMX / TSX | Several atlases, image-collection tilesets, external TSX, XML/CSV/base64 data, gzip/zlib/Zstandard, all projections, infinite chunks, flip flags, height layers, object and group data | TMX · multi atlas with several image sidecars |
| Isberg tile project | .isbtiles, .gbtiles; reference .croco, .crocotile, .c3dp (import only) | Isberg tiles (.isbtiles) |
| Scene JSON | Full platform scene | Scene 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
- Under Animation & morphs, choose a Clip (Rest pose for none) and click ▶ Preview, or set Time. An Act plays a choreography instead.
- Drag a target slider (−2 to 2) to try a weight by hand.
- 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.
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
solidstill 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.jsonsidecar 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:
| Option | Values |
|---|---|
| TMX data | csv, base64, xml |
| TMX projection | Preserve source, orthogonal, isometric, staggered, hexagonal, oblique |
| Preserve chunks | Keep authored chunk rectangles (default on). |
| 3D → TMX | Existing 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:
- Choose a Domain: 3D action curves, UV frame sequence, Choreography or Billboard / mirror.
- Choose a Record and edit its JSON.
- 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
- Choose a Format under Export locally and set its options.
- For static formats, the current Clip, Act and Time choose the pose that is written.
- 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:
| Mode | Behavior |
|---|---|
| Existing floor tiles | Writes grid floor tiles as they are; fails if the scene has no grid tiles. |
| UV/color projection | Rasterizes 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 voxels | Tests triangles against cells and records surface occupancy; each height slice becomes a layer. |
| Setting | Default | Range |
|---|---|---|
| Cell size | 1 | 0.0001–10,000 |
| Height step | 1 | 0.0001–10,000 |
| Tile pixels | 16 | 1–128 |
Maximum cells (MCP maxCells) | 65,536 | 1–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.
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
| Item | Limit |
|---|---|
| Input file, compressed input | 256 MB each |
| ASCII FBX | 64 MB |
| FBX records | One million nodes, 256 nesting levels |
| PLY, STL, Draco geometry | 250,000 vertices |
| Point cloud | 250,000 points |
| Polygon | 4,096 corners |
| TMX map or layer | One million cells |
| Preview | 20,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
interchange_capabilities: list supported import/export domains and unsupported features.interchange_import: decode a local file into a portable scene JSON; sidecars in its folder are found, and explicit resource mappings are accepted.interchange_info: inspect an imported scene, or a raw model file directly.interchange_export: export a stored scene and its sidecars, with format, encoding, projection and bake options.interchange_export_live: export the running 3D editor's state.interchange_morph: sample morph weights, apply weights or save a baked pose.interchange_point_cloud: read, create, replace or remove a point cloud on a node.interchange_open: send a stored scene into the running 3D editor.interchange_fbx_metadata: inspect ASCII or binary FBX records.scene3d_import,scene3d_export: the 3D editor's simpler importer and exporter.
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_importand 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
| Backend | Languages | Use it for |
|---|---|---|
| Standalone WebGL | Spatial / 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 engine | Complete engine shader source: spatial, canvas, particles, sky and fog | Shaders 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.
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
| Control | Effect |
|---|---|
| Node type list + Add node | Adds a node from the catalog. |
| Delete node | Deletes the selected node. The material output cannot be deleted. |
| Disconnect input | Disconnects the input port you last clicked. |
| Undo, Redo | Graph history, 60 steps. |
| Compile & preview | Compiles the graph and renders it in the preview panel. |
| Save graph, Open graph | Save or open <name>.shader-graph.json. |
| Export shader | Saves the generated source as <name>.gdshader. |
| New graph | Starts a new default graph. |
| Kind list | spatial or canvas_item. |
| Backend list | Standalone WebGL or Full embedded engine. |
| Unshaded | Compiles an unshaded material. |
| Zoom slider | 50–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.
| Node | Inputs (default) | Output | Parameters |
|---|---|---|---|
| Number | float | Value (1) | |
| Vector | vec3 | Value (1, 1, 1), width 2–4 | |
| Color | vec4 | RGBA value (0.15, 0.75, 0.5, 1) | |
| Uniform | float or vector | Name (amount), type float/vec2/vec3/vec4, default | |
| Local texture | uv (vec2) | vec4 | Sampler name (surface_texture), embedded PNG/JPEG/WebP image; white when empty |
| UV | vec2 | UV set 0 or 1 | |
| Time | float | ||
| Surface normal | vec3 | ||
| View direction | vec3 | Fragment stage only | |
| Vertex position | vec3 | ||
| Add | a (0), b (0) | dynamic | |
| Subtract | a (0), b (0) | dynamic | |
| Multiply | a (1), b (1) | dynamic | |
| Divide | a (0), b (1) | dynamic | |
| Power | a (0), b (2) | dynamic | |
| Minimum | a (0), b (1) | dynamic | |
| Maximum | a (0), b (1) | dynamic | |
| Sine | x (0) | dynamic | |
| Cosine | x (0) | dynamic | |
| Absolute | x (0) | dynamic | |
| Fraction | x (0) | dynamic | |
| Floor | x (0) | dynamic | |
| Normalize | x (vec3) | dynamic | |
| Length | x (vec3) | float | |
| Dot product | a, b (vec3) | float | |
| Cross product | a, b (vec3) | vec3 | |
| Mix | a (0), b (1), weight (0.5) | dynamic | |
| Clamp | x (0), min (0), max (1) | dynamic | |
| Smooth step | edge0 (0), edge1 (1), x (0) | dynamic | |
| Compose vector | x, y, z (0), w (1) | vec2–vec4 | Width 2–4 (default 3) |
| Vector component | vector (vec4) | float | Component 0–3 |
| Material output | color (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.
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.
| Control | Effect |
|---|---|
| Language list | Spatial / canvas source or Plain GLSL. The full engine always uses source. |
| Backend list | Standalone WebGL or Full embedded engine. |
| Compile & apply | Checks the source, compiles it on the GPU and updates the preview and uniform controls. |
| Save material | Saves <name>.shader.json. |
| Open material/source | Opens a material .json or a .gdshader source file. |
| Example | Replaces the document with the example for the current language. |
| Stage list | For Plain GLSL: GLSL vertex or GLSL fragment. |
| Add local include + include path | Adds an include file (see Includes). |
| Profile list, Software Vulkan | Full engine only: Web compatibility or Windows Forward+ Vulkan. |
| GLSL transparency, side list, GLSL version, Write depth, Test depth | Plain GLSL settings: transparency, double/front/back side, GLSL 1 or GLSL 3 / WebGL 2, depth write and depth test. |
| Show generated GPU code | Shows 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
| Domain | Supported |
|---|---|
| Shader kinds | shader_type spatial, shader_type canvas_item |
| Functions | Parameterless void vertex() and void fragment(), plus reachable scalar/vector/matrix helper functions |
| Uniforms | float, int, bool, vec2/3/4, ivec2/3/4, mat3/4, sampler2D; literal defaults, source-color, range, filter and repeat hints |
| Globals | Typed constants and varyings |
| Vertex data | VERTEX, NORMAL, UV, UV2, COLOR, CUSTOM0–CUSTOM3 |
| Fragment outputs | ALBEDO, ALPHA, ROUGHNESS, METALLIC, SPECULAR, EMISSION, AO, ALPHA_SCISSOR_THRESHOLD |
| Other built-ins | TIME, 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 modes | Blend 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.
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 listTEXTURE.- 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.pngfrom 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.
| Item | Limit |
|---|---|
| Each source text | 256 KiB |
| Embedded textures | 32 per material, each under 8 MiB (PNG, JPEG or WebP) |
| Includes | 256 files, 4 MiB in total |
| Uniform arrays | 4,096 values |
| Graph | 512 nodes, 4,096 links |
MCP tools
shader_graph_project: create, inspect or update a graph (name, kind, unshaded, backend).shader_graph_node: add, update, remove or list nodes, values, defaults, positions and textures.shader_graph_connect: connect, disconnect or list edges.shader_graph_compile: write the material JSON and/or generated.gdshader.shader_graph_preview: run the graph on its backend and capture a PNG.shader_create: create a material from source text, a file or GLSL stages.shader_validate: check structure and subset support (no GPU compile).shader_translate: write the translated GLSL stages.shader_uniform: set or reset a uniform, embed or clear a texture.shader_scene_material: attach, remove or inspect a shader on a 3D scene material.shader_native_project: write a reviewable native project with the source, includes, textures and a preview fixture.shader_compile: compile and link on the GPU and return driver diagnostics.shader_preview: render to PNG on the GPU.native_shader_preview: compile and render source in the Windows Forward+ Vulkan renderer.
GPU tools start the bundled platform when needed. shader_compile and shader_preview choose the full engine automatically for native documents.
Troubleshooting
sourceValidis true butgpuCompiledis 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.
| Property | Range / default | Meaning |
|---|---|---|
| Name, Visible | Layer label and visibility. | |
| Parent (offsets are relative) | No parent | The layer follows its parent; position is relative. Cycles are rejected. |
| Show when | Always | See Speaking, blink and visibility gates. |
| Talk state, Blink state | 0–2, default 0 | Independent gates: 0 any, 1 silent/open, 2 speaking/closed. |
| Toggle hotkey | Up to 24 characters | Key that shows or hides the layer. |
| Costume membership | All ten on | Costumes 1–9 and 0 in which the layer appears. |
| Replace PNG | Swaps the image and resets the sheet to one frame. | |
| X position, Y position | Pixels | Position on the stage or relative to the parent. |
| Rotation (degrees) | 0 | Static rotation. |
| Z order | −4096–4096, default 0 | Drawing order. |
| Image offset X/Y | 0 | Shifts the image relative to its pivot. |
| Flip X, Flip Y | Off | Mirror the image. |
| Clip child sprites to image alpha | Off | Descendants draw only where this image is opaque. |
| Ignore bounce effects | Off | Excludes the layer from speech bounce. |
| Scale X/Y | 0.01–100, default 1 | |
| Pivot X/Y (0–1) | Default 0.5 | Rotation and scale centre. |
| Opacity | 0–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 when | Visible |
|---|---|
| Always | At all times. |
| Speaking / Silent | While speaking / while silent. |
| Blinking / Eyes open | During a blink / between blinks. |
| Speaking + blink / Silent + blink | While 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.
| Field | Range / default | Mode |
|---|---|---|
| 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 together | Seconds |
| Sine phase (radians) | Default 0; sets X and Y phase together | Seconds |
| X sine speed, Y sine speed | 0–20, default 1 | Seconds |
| Rotation sway (degrees) | −180–180, default 0 | Seconds |
| Speaking bounce | 0–500, default 10 | Seconds |
| Spring follow / jiggle | Off | Seconds |
| Spring stiffness, Spring damping | 1–1000 (90); 0–100 (16) | Seconds |
| Drag amount | 0–1, default 0.35 | Seconds |
| X/Y sine frequency (radians / tick) | Default 0 | Compatibility |
| Position drag (0 snaps) | 0–100, default 0 | Compatibility |
| Rotational drag | −100–100, default 0 | Compatibility |
| Rotation limit minimum/maximum | −360–360; default −180 and 180 | Compatibility |
| Stretch amount | −100–100, default 0 | Compatibility |
| Native animation speed | 0–10000, default 0 | Compatibility |
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
- Arrange layer visibility, position, rotation, scale and opacity.
- Type a New expression name and click Capture expression.
- 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).
| Setting | Range / default | Meaning |
|---|---|---|
| Microphone analysis | RMS / envelope (default) or Source spectrum / sensitivity | How volume is measured. |
| Speaking threshold (RMS) | 0.001–1, default 0.075 | RMS volume that counts as speaking. |
| Microphone gain | 0–20, default 1 | RMS mode. |
| Noise gate | 0–1, default 0 | RMS mode. |
| Speech release (seconds) | 0–5, default 0.15 | Hold time after speech stops. |
| Volume smoothing (seconds) | 0–2, default 0.05 | |
| Source FFT bins | 256, 512, 1024, 2048, 4096; default 256 | Spectrum mode. |
| Source volume limit | 0–2, default 0.075 | Spectrum volume that resets sensitivity to 1. |
| Source sensitivity threshold | 0–1, default 0.1 | Sensitivity above which the avatar speaks. |
| Echo cancellation, Noise suppression, Automatic gain | On, on, off | Capture 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.
Blink timing
| Setting | Range / default |
|---|---|
| Blink mode | Periodic blink (default) or Native timing / seeded blink |
| Blink interval (seconds) | 0.25–60, default 4 (periodic) |
| Blink duration (seconds) | 0.02–1, default 0.16 (periodic) |
| Blink random algorithm | PCG / source float draws (default) or Legacy LCG |
| Native blink delay scale | 0.01–10, default 1 |
| Native blink chance denominator | 1–1,000,000, default 200 |
| Blink random seed | 0–4,294,967,295, default 1 |
Native timing waits 420 × delay-scale ticks, checks the chance, and holds each blink for 12 ticks. It is seeded and deterministic; it cannot recover the random state of a session in another application. Rigs saved without an algorithm keep the legacy behavior.
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 setting | Range / default |
|---|---|
| Output / recording FPS | 1–240, default 60 |
| Output scale | 0.1–8, default 1; the window is resized up to 4× |
| Smooth filtering | Off (pixel-sharp) |
| Output always on top | On |
| Output click through | Off |
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
- Click Open rig and choose an indexed JSON
.savefile from a PNG avatar application. - 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.
.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
| Key | Action |
|---|---|
| 1–9, 0 | Costume 1–9, 10 |
| Space | Toggle test speaking |
| Arrow keys (Shift for 10 px) | Nudge the selected layer (editor only) |
| Ctrl+Z / Ctrl+Shift+Z | Undo / redo (editor only) |
| Esc | Cancel a sprite drag |
| B | Toggle blink (output window only) |
| Expression, layer and custom hotkeys | As 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.
avatar_create: create a rig, optionally with PNG layers.avatar_validate: validate a rig and report hierarchy and sheet data.avatar_edit: patch a rig, or add, update or remove a layer.avatar_evaluate: evaluate speaking, blinking, sheet frames, transforms and springs at given times.avatar_import_native: import a native.save, with image mappings for path-only records.avatar_export_native: export a complete.isbavatar.avatar_settings: timing, microphone, blink, output and bounce settings.avatar_layer_transform: transforms, pivots, offsets, flips, opacity and Z order.avatar_layer_motion: sine, spring and compatibility motion fields.avatar_layer_visibility: conditions, gates, costumes, clipping, hotkey and bounce policy.avatar_layer_operation: duplicate, reparent, reorder, replace PNG or remove.avatar_expression: capture, edit, remove or activate expressions; select a costume.avatar_hotkeys: set or inspect up to 128 key bindings.avatar_frame: evaluate one deterministic frame with gates, clipping and Z order.avatar_render_png: render a frame to PNG at a time or tick, volume, blink, costume and expression.avatar_history: undo or redo typed edits (50 revisions).avatar_signal: configure signal settings, replay PCG and blink state, analyze WAV spectra, replay sensitivity.
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
speakaction. - "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).
| Editor | Use it for | Saves as | Exports |
|---|---|---|---|
| Music & composition | Polyphonic synth, sampler and audio-clip tracks, piano roll, automation, DSP effect chains, tempo maps, MIDI | .music.json composition | WAV (16/24-bit), MP3, Ogg Vorbis, FLAC, MIDI, synchronized stems ZIP |
| Audio workshop | Procedural 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 sound | Parameter synthesis with ten wave shapes, moving control sources, modulators, ordered effects, EQ and compression | .isbsound document, GBS1: setup code | WAV (native 8/16-bit, 22.05/44.1 kHz), FLAC, Ogg Vorbis, MP3 |
| Sound designer | Fast seeded retro effects from one oscillator with envelope, pitch, filter and delay controls | sound-settings.json | Mono 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
| Control | What it does | Range / options |
|---|---|---|
| Sketch list + Load sketch | Replaces 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 composition | Starts an empty composition with one synth track named Instrument. | |
| Undo / Redo | Steps through up to 40 editing snapshots. | |
| ▶ Render & play | Renders the whole composition and plays it. The overview waveform and status line show duration, track count, sample rate and peak. | |
| Stop | Stops playback and any render in progress. | |
| Cancel render | Cancels a render or stem export in progress. | |
| Tempo | Base tempo in BPM (sets the tempo point at beat 0). | 20–400 |
| Beats | Composition length in beats. | 0.25–1200 in the field |
| Rate | Output sample rate. | 22050, 44100, 48000 Hz |
| Tail · sec | Extra 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:
| Field | Meaning | Range / default |
|---|---|---|
| Name | Track name | Text |
| Instrument | Track kind | synth, sampler, clip |
| Oscillator | Synth waveform | sine, square, saw, triangle, noise (deterministic) |
| Sample | Embedded sample used by sampler and clip tracks | Any embedded sample |
| Gain | Track level | 0–4 (default 0.7) |
| Pan | Stereo position; constant-power for mono sources, unity-gain balance for stereo sources | −1 to +1 |
| Pitch · semitones | Transposition. For samples and clips, pitch changes without changing duration. | −24 to +24 |
| Stretch duration | Changes sample duration without changing pitch (phase vocoder). 2 doubles the duration; it does not mean double speed. | 0.25–4 |
| Sampler root | MIDI note at which the sample plays at its original pitch | 0–127 (default 60) |
| Clip start · beat | Where a clip starts on the timeline | 0–1200 beats |
| Trim start · sec / Trim end · sec | Portion of the sample used; leave Trim end empty to use the whole sample | 0–180 s |
| Reverse | Plays the sample backwards | On/off |
| Loop sample | Loops sampler notes and clips | On/off |
| Attack · sec, Decay · sec, Release · sec | Envelope stage times | 0–5 s (defaults 0.005, 0.08, 0.12) |
| Sustain level | Envelope sustain level | 0–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.
| Parameter | Lane range |
|---|---|
| gain | 0–2 |
| pan | −1 to +1 |
| cutoff | 20–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.
| Effect | Fields (default) | Ranges |
|---|---|---|
| filter | lowpass (8000), highpass (20) | low-pass 20–48000 Hz; high-pass 0–48000 Hz |
| delay | time (0.25), mix (0.35), feedback (0.3) | time 0.001–2 s; mix 0–1; feedback 0–0.9 |
| convolution | mix (0.4), normalize (off), Impulse sample | mix 0–1; impulse response up to 65,536 frames, mono or stereo |
| spectral | lowHz (0), highHz (20000), formant (0), freeze (off), freezeAt (0.2) | low/high 0–48000 Hz; formant −24 to +24 semitones; freezeAt 0–180 s |
| vocoder | bands (16), lowHz (80), highHz (8000), attack (0.005), release (0.06), Voice/modulator | bands 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) orpolyPressure(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 compressedogg,flacandmp3(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.jsoncomposition.
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.
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:
| Tool | Panel title | Use |
|---|---|---|
| 01 Sound effects | SOUND EFFECT DESIGNER | Short sounds from synthesized layers (0.2–20 s) |
| 02 Ambience | AMBIENT SOUNDTRACK CREATOR | Evolving atmosphere layers (0.2–120 s) |
| 03 Transform | IMPORT & TRANSFORM | Mixing 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.
| Tool | Control | Range |
|---|---|---|
| Sound effects | Duration | 0.2–20 s |
| Darkness | 0–100% | |
| Roughness | 0–100% | |
| Movement | 0–100% | |
| ⚄ Create a variation | Randomizes the seed, layer frequencies, pans and pulse spacing, darkness and movement (undoable) | |
| Ambience | Duration, Darkness, Event density, Movement, ⚄ Create a variation | Duration 0.2–120 s; others 0–100% |
| Transform (selected track) | Pitch | −24 to +24 semitones |
| Playback speed | 0.25–2× | |
| Darkness | 0–100% (whole mix) | |
| Trim start (s), Trim end (s), ⇄ Reverse, Hear original | Trim 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.
| Field | Applies to | Range / options |
|---|---|---|
| Source | Synthesized layers | sine, 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 layers | 15–8000 |
| Pan | All | −1 (left) to +1 (right) |
| Attack (s) / Release (s) | Synthesized layers | 0.002–10 |
| Fade in (s) / Fade out (s) | Imported tracks | 0.002–10 |
| Start offset (s) | All | Layers: 0 to the scene length; tracks: 0–179.9 |
| Layer length (%) | Synthesized layers | 1–100% of the scene |
| Pulse / event spacing | Synthesized layers | 0.1–20 |
| Playback | Synthesized layers | Continuous, Sparse events |
| Track name | Imported tracks | Up to 70 characters |
| Repeat | Imported tracks | Play 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.
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:
| Field | Options |
|---|---|
| File name | Text (sanitized to lowercase letters, digits, - and _) |
| Sample rate | 48,000 Hz, 44,100 Hz |
| Bit depth | 24-bit PCM WAV, 16-bit PCM WAV |
| Channels | Stereo, Mono |
| Output | Full mix, Separate layer WAVs (one file per audible layer, respecting mute/solo) |
| Normalize peak to −1 dB | On 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
| Control | What it does |
|---|---|
| Preset list + Load preset | coin, 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 sound | Resets the sound (generator reset, or a default sound in sketch mode). |
| Undo / Redo | Up to 60 steps; includes variation and DSP-session state. |
| Render & play, Stop, Cancel render, Loop playback | Render and listen; the waveform and status show duration, sample count, rate and peak. |
| Calibrated generators / Studio sketches | Chooses which preset family Load preset and New sound use. |
| Randomize controls | Randomizes the whole model, including effect routing and enabled states. |
| Mutate controls | Changes selected continuous controls slightly. |
| Variation seed + Reset variation stream | Seed 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 cursor | See 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,pinkandbrown(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
| Group | Controls |
|---|---|
| Vibrato, Tremolo, Ring modulation, Wah filter | Enabled, Wave shape (sine, cubic, triangle, saw, square, white), Invert modulation, Frequency control and Depth control (control sources) |
| Harmony | Enabled, Octave overtone count, Overtone falloff |
| Frequency modulation | Enabled, Strength, Tone ratio |
| Arpeggio | Enabled, 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
.isbsounddocument with all controls, names, variation stream and DSP session. - Open sound accepts
.isbsound,.gbsound,.jsonand legacy compact.cptsetup files (version 2 only; unknown versions are rejected). - Compressed setup code: Create code writes an Isberg code starting with
GBS1:; Apply code loads aGBS1: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), orflac,ogg,mp3through the bundled codec.
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.
| Group | Control | Slider range | Saved-settings limit |
|---|---|---|---|
| Oscillator | Waveform | sine, square, saw, triangle, noise, pink | |
| Sample rate | 8000, 11025, 22050, 44100, 48000 Hz | 8000–96000 | |
| Frequency · Hz | 20–4000 | 1 Hz to just under half the sample rate | |
| Volume | 0–1 | ||
| Pulse width | 0.02–0.98 | 0.01–0.99 | |
| Pulse width sweep | −1 to +1 | −2 to +2 | |
| Envelope | Attack · seconds | 0–2 | 0–5 |
| Hold · seconds | 0–2 | 0–5 | |
| Decay · seconds | 0–2 | 0–5 | |
| Release · seconds | 0–2 | 0–5 | |
| Sustain level | 0–1 | ||
| Retrigger · Hz | 0–40 | 0–100 | |
| Pitch & modulation | Pitch slide · semitones/s | −60 to +60 | ±120 |
| Pitch acceleration | −60 to +60 | ±120 | |
| Vibrato · cents | 0–500 | 0–1200 | |
| Vibrato rate · Hz | 0–30 | 0–100 | |
| Arpeggio rate · Hz | 0.5–40 | 0.01–100 | |
| Arpeggio · semitone offsets | Comma-separated, e.g. 0, 7, 12; each −48 to +48 | Up to 64 steps | |
| Filters & effects | Low-pass · Hz | 20–22000 | Up to half the sample rate |
| Low-pass sweep | −4 to +4 (octaves per second) | ±8 | |
| High-pass · Hz | 0–10000 | ||
| High-pass sweep | −4 to +4 | ±8 | |
| Distortion | 0–10 | 0–20 | |
| Bit depth | 2–16 | 2–24 | |
| Sample hold | 1–32 | 1–64 | |
| Delay · seconds | 0.01–1 | 0.001–2 | |
| Delay mix | 0–0.8 | 0–0.85 | |
| Delay feedback | 0–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).
| Control | Options (default first where stated) |
|---|---|
| Game style | Retro 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 |
| Seed | 0–4294967295 (default 1). The same seed reproduces the same settings. |
| PCM bits | 24, 16 |
| Delivery Hz | 48000, 44100, 22050, 96000 |
| Peak dBFS | −3, −6, −1 |
| Taper loop edges | Off by default |
| Variations | 3, 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.
Audio formats
| Editor | Imports | Exports |
|---|---|---|
| Music & composition | WAV (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.json | WAV 16/24-bit stereo; MP3, Ogg Vorbis, FLAC; MIDI; stems ZIP; .music.json |
| Audio workshop | WAV, MP3 and other decoder-supported formats; microphone recording; .audio.json | WAV 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 codes | WAV 8/16-bit, 22.05/44.1 kHz mono; FLAC, Ogg Vorbis, MP3; .isbsound; GBS1: codes |
| Sound designer | sound-settings.json | Mono 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
parameter_sound_project: create, inspect or patch a sound, with preset and seed.parameter_sound_control: inspect or set every nested control.parameter_sound_setup: import.cpt, export.isbsound, encode or decodeGBS1:codes.parameter_sound_render: render a sound to native WAV.parameter_sound_job: start, poll, list or cancel background renders.parameter_sound_variation: generators, randomize, mutate (amount 0–1) and reset, with seed or saved random state.parameter_sound_session: create, restore, route, replay and render retained DSP sessions (at most four session renders at once).
Sound designer, encoding and presets
sfx_presets: list the Sound designer presets.sfx_generate: synthesize a sound effect WAV from a preset and/or options.media_encode_audio: convert a WAV to MP3, Ogg Vorbis or FLAC with the bundled codec (quality 0–9).workspace_game_presets: list the game-style recipes and what they do in each editor.workspace_game_preset_apply: apply a game style toaudio-advanced,audio,parameter-sfxorsfxas an undoable edit.workspace_commandsandworkspace_execute: discover and drive any control in the running editors.
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.jsonproject, 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
.cptsetup, 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:
| Button | What it does |
|---|---|
| New | Replaces 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 demo | Opens the bundled Autotile Harbor project: animated tiles, a plugin journal, configurable commands, side-view actors, particle effects and time-progress (TPB wait) battles. |
| Open | Opens .isbrpg, legacy .gbrpg or .json documents up to 384 MiB. |
| Save | Saves the project as <game title>.isbrpg. |
| Import RPG project | Imports a project folder; see Importing RPG projects. |
| Undo / Redo | Up to 40 steps of project history. |
| ▶ Playtest | Opens 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:
| Control | Options |
|---|---|
| Layer | Layer 1–Layer 4 (tile IDs 0–8191), Shadows (0–15), Regions (0–255). Shadow and region values are drawn as numbers on the map. |
| Brush | Pencil (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) |
| Zoom | 50%, 75%, 88% (default), 100%, 150%. Large maps are previewed at a smaller tile size. |
| Grid | Shows 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:
| Sheet | Tile IDs | Contents |
|---|---|---|
| A1 | 2048 onward, 16 autotile kinds × 48 shapes | Animated water and waterfall autotiles |
| A2 | 2816 onward, 32 kinds | Floor (ground) autotiles |
| A3 | 4352 onward, 32 kinds | Roof and building-wall autotiles |
| A4 | 5888 onward, 48 kinds | Wall-top and wall-side autotiles |
| A5 | 1536–1663 | 128 plain ground tiles |
| B, C, D, E | 0–255, 256–511, 512–767, 768–1023 | Upper-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
| Field | Meaning |
|---|---|
| Name, Display name | Editor name and the name shown in game |
| Width, Height, Resize map | 1–256 cells each. Resizing is refused if an event or the player start would fall outside the map. |
| Parent map | Places the map under another map in the list (cycles are refused) |
| Tileset | Tileset record used by the map |
| Selected tile properties | Passage 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 |
| Loop | None, Vertical, Horizontal, Both |
| Encounter steps | Steps between random encounters (default 30) |
| Edit events | Opens the Events tab for this map |
| Advanced map properties | All other map fields as JSON (autoplay BGM/BGS, battlebacks, parallax and its scrolling, encounter list, dashing, note); press Apply properties |
| Delete map | Removes the map (not available for the last map, or while the player starts there) |
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 type | Main fields |
|---|---|
| Actors | Name, nickname, profile, class, initial and maximum level, starting equipment, character/face/battler images, traits, note |
| Classes | Name, parameter curves, experience curve, learnable skills by level, traits, note |
| Skills | Name, 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 |
| Items | Name, description, icon, item type, price, consumable, scope, occasion, speed, success rate, repeats, hit type, damage, effects, animation |
| Weapons | Name, description, icon, weapon type, equipment type, price, parameters, traits, animation |
| Armors | Name, description, icon, armor type, equipment type, price, parameters, traits |
| Enemies | Name, battler image and hue, parameters, EXP, gold, drop items, action patterns, traits |
| Troops | Name, member enemies and positions, battle event pages |
| States | Name, icon, restriction, priority, motion, overlay, minimum/maximum turns, auto-removal timing, removal at battle end, by restriction, by damage or by walking, messages, traits |
| Animations | Name, effect file, display type, offset, rotation, scale, speed, flash and sound timings |
| Tilesets | Name, mode, assigned A1–E sheet images, per-tile flags, note |
| CommonEvents | Name, trigger, switch, command list |
| System | Game 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
| Setting | Options |
|---|---|
| Trigger | Action button, Player touch, Event touch, Autorun, Parallel |
| Page conditions | Switch 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. |
| Priority | Below characters, Same as characters, Above characters |
| Options | walkAnime, 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.
| Group | Commands (code) |
|---|---|
| Messages | Show 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 control | Conditional 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 progress | Control Switches (121), Control Variables (122), Control Self Switch (123), Control Timer (124) |
| Party | Change Gold (125), Change Items (126), Change Weapons (127), Change Armors (128), Change Party Member (129) |
| System settings | Change 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) |
| Movement | Transfer 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) |
| Character | Change Transparency (211), Show Animation (212), Show Balloon Icon (213), Erase Event (214), Change Followers (216), Gather Followers (217) |
| Screen | Fadeout Screen (221), Fadein Screen (222), Tint Screen (223), Flash Screen (224), Shake Screen (225), Wait (230) |
| Pictures and weather | Show Picture (231), Move Picture (232), Rotate Picture (233), Tint Picture (234), Erase Picture (235), Set Weather Effect (236) |
| Audio and video | Play 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) |
| Map | Change Map Name Display (281), Change Tileset (282), Change Battle Back (283), Change Parallax (284), Get Location Info (285) |
| Scene | Battle 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) |
| Actor | Change 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) |
| Battle | Change 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) |
| Advanced | Script (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.
| Output | Sheet size (px) |
|---|---|
| Walking sheet | 144 × 192 |
| Face portrait | 144 × 144 |
| Damage sheet | 144 × 48 |
| Side-view battler | 576 × 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.
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.
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.
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
- Open the Plugins tab and press Import JavaScript…. Choose one or more
.jsfiles (up to 16 MiB each; names must be unique). You can also import plugins with a whole project folder. - Select a plugin in the list (☑ enabled, ☐ disabled, with its load position). The page shows its description and author.
- 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.
- Edit Parameters and press Apply parameters.
- 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).
- 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 type | Control |
|---|---|
| boolean, select | Drop-down (ON/OFF labels or the declared options) |
| actor, class, skill, item, weapon, armor, enemy, troop, state, animation, tileset, common_event, switch, variable | Drop-down of the project's records, with 0: None |
| number | Number field honoring min, max and decimals |
| multiline_string | Multi-line text |
Arrays and struct<…> | JSON text (validated when you apply) |
| file | Text field showing the asset directory |
| string and others | Text 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.
| Area | Available |
|---|---|
| Display classes | Bitmap, Sprite, TilingSprite, Tilemap, ColorFilter, ScreenSprite, Stage, Window, WindowLayer, on a bundled PIXI renderer with a real Application and Ticker |
| Namespaces | Graphics (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 objects | Game_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 |
| Scenes | Scene_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 |
| Windows | Window_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 spritesets | Spriteset_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 utilities | SceneManager, 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 helpers | PluginManagerEx-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 play | Where saves live |
|---|---|
| Studio playtest | In the RPG Creator editor state, saved with your .isberg project |
| Playable HTML and web folder | The browser's local storage for that page |
| Windows game | The Data folder beside the game's .exe; moving the whole folder keeps the saves |
| macOS game | Data 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.
- Press Import RPG project and choose either the project folder or its
datafolder. The selection must contain exactly oneSystem.json. - If you chose the project folder, RPG Creator imports
data/*.json,js/plugins.jsand the plugin sources injs/plugins/, and every file underimg,audio,movies,effectsandfonts. If you chose thedatafolder, it imports the JSON alone. - 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.
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.
| Button | Output |
|---|---|
| Save RPG project | The editable .isbrpg document |
| Export playable HTML | One 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 ZIP | Project data, resources and plugins for interchange (see above) |
| Export Windows game | A 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 folder | A standalone folder with index.html, the project source, EXPORT.json and README.txt |
- For the Windows, macOS and web exports, type an Empty export folder or press Choose folder.
- For macOS, choose the Mac architecture.
- 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.
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
MCP tools
rpg_project: create (starter or blank, name, size 1–256), inspect or update an.isbrpgwith 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,.rmmzprojectmarker 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 (arm64orx64) 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 itsdatafolder. - "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/tilesetsand 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.
| Profile | Engine | What it provides |
|---|---|---|
| Windows native (default) | Custom 4.7.2 editor and runtime, loaded as a DLL inside the Isberg Labs native host | The 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 compatibility | Official Godot 4.5.2 WebAssembly editor and engine | The 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
| Component | Version | Used 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.12 | Compile C#, C# games, the integrated .NET Windows export |
| Portable C/C++ compiler | Zig toolchain 0.15.2, with the engine's stable C ABI header | Building GDExtension libraries for every target |
| Lua GDExtension | 0.7.0, with Lua 5.4.7 | Lua scripts in native play and exported games |
| Software Vulkan driver | SwiftShader (CPU) | Vulkan rendering without a compatible GPU driver |
| Export editor and templates | Godot 4.5.2-stable | Windows, macOS, Linux, Android and iOS exports |
| Web engine and editor | Godot 4.5.2-stable WebAssembly | Web compatibility profile and its exports |
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
| Control | What it does |
|---|---|
| Project path field | Local project folder, ZIP or PCK to open. Browse picks a file or folder. |
| Rendering method | Forward+ (default), Mobile Vulkan or OpenGL compatibility. Forward+ and Mobile use Vulkan; OpenGL compatibility uses OpenGL 3. |
| Audio output | Local audio (WASAPI, default) or Muted. |
| Software Vulkan | On by default. Uses the bundled CPU Vulkan driver instead of your GPU driver. Ignored for OpenGL compatibility. |
| Debugger | Off by default. When on, Run project starts the debug engine library and connects the native debugger. |
| Edit project | Opens the project in the persistent native editor. |
| GDExtension (Best for Performance) | On by default. New demo projects receive the C GDExtension starter. |
| New demo | Creates a demo project and opens it in the editor. |
| Build GDExtension | Compiles the project's native/build.json extension for Windows. |
| Import assets | Runs 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 project | Imports assets, then runs the game in the viewport. |
| Editor / Game | Switch the viewport between the editor and the running game. Each opens its session if none is running. |
| Save files | Saves every open scene and embeds the current files in the portable project. |
| Pause / resume | Pauses or resumes the running game's scene tree. |
| Stop | Closes the running game and returns to the editor if it is open. |
| Capture | Saves the current native viewport as native-viewport.png. |
| Tools | Shows or hides the side panel. |
Tools side panel
| Section | Controls |
|---|---|
| Native scene | The node list of the active session (name · type). Click a node to show its properties below the list. |
| Scene authoring | Scene 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 method | Method name (default get_position) and JSON argument array; Call runs it on the selected node and shows the result. |
| Local source | A res:// path (default res://native/gamebench_extension.c), Read source, a text editor and Write source. Requires Edit project. |
| Native debugger | break, continue, step, next, out, get_stack_dump, Frame variables. See Native debugger. |
| Vulkan compute | GLSL 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 log | Compiler, 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.
- Type a path in the project path field or click Browse.
- Click Edit project to open the editor, or Run project to import and play it.
- Check the Engine log for import or script errors.
| Source | Handling |
|---|---|
Project folder or project.godot | Copied with all files. Symbolic links are refused. |
Folder with only project.binary | Recovered 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 PCK | Unpacked 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
.luafiles and has none, and registers project extensions so Lua loads before the first import; - compiles C# source before running a game that contains
.csfiles; - removes an Isberg editor bridge add-on left by an earlier session from the staged copy (your own add-ons are untouched).
.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
.isbergproject. 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.
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 underData\NativeRuntimein 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:
- Level & playtest: turn on Full engine playtest, then play. See Level & playtest.
- Script workspace: Run full engine. See Attach, run and step.
- MCP:
runtime_workspace_projectconverts a level or 3D scene JSON file (kindlevelorscene3d).
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:
| Action | Keys |
|---|---|
move_forward / move_back | W or Up / S or Down |
move_left / move_right | A or Left / D or Right |
jump, sprint, crouch | Space, Shift, Ctrl |
noclip, torch | F, T |
| Capture / release mouse | Left click / Esc |
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:
| Value | JSON 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 range | A decimal string (int64) |
| Objects and RIDs returned by calls | Session-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
| File | Contents |
|---|---|
native/gamebench_extension.c | Editable 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.h | The engine's stable C ABI header (MIT notice retained). |
native/build.json | Build settings. |
native/example.gd | Prints GamebenchPerformance.sum_squares(10) (385). |
native/README.txt | Usage 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 field | Default | Values |
|---|---|---|
language | c | c, cpp |
sources | ["native/gamebench_extension.c"] | 1 to 1024 project files |
includes | ["native/include"] | Project folders |
entry | gamebench_extension_init | A C identifier |
descriptor | extension.gdextension | Project path |
optimization | ReleaseFast | Debug, ReleaseFast, ReleaseSafe, ReleaseSmall |
freestanding | true | No C runtime or OS libraries |
| Target | Output | Notes |
|---|---|---|
| Windows x86_64 | .dll | Built by the panel buttons |
| Linux x86_64, arm64 | .so | Built during export or through MCP |
| macOS x86_64, arm64, universal | .dylib | Export builds a universal library |
| Android arm64 | lib….so | Freestanding sources only (no NDK is bundled) |
| iOS arm64 | Static .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.
Native debugger
- Turn on Debugger in the toolbar.
- Click Run project. The game starts with the debug library and connects to a private loopback debugger.
- Use the Native debugger buttons in the side panel. Results appear in the details area.
| Button | Effect |
|---|---|
| break | Pause script execution. |
| continue | Resume. |
| step / next / out | Step into, step over, step out. |
| get_stack_dump | Show the call stack. |
| Frame variables | Show 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.
| Panel | Controls |
|---|---|
| Action curves | Action 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 sequences | Sequence 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 markers | Act 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 targets | Saved 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 portableDatafolder.
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.
| Control | What it does |
|---|---|
| Project path field, Browse | Local project folder, project.godot, ZIP or PCK. |
| Edit project / New demo | Open the project or a demo in the persistent web editor. |
| Run project | Import and run. With the editor open, it saves and synchronizes files, then plays them. |
| Editor / Game | Switch the view. |
| Save files | Save 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, Capture | Control the game; Capture saves game-viewport.png from a running game. |
| Tools | Side 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 game | Portable 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.
.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
| Tool | Purpose |
|---|---|
native_runtime_info | Bundled native engine, .NET, render profiles and active sessions. |
native_project_open | Stage and run or edit a project with renderer, driver (including D3D12), audio, debug and breakpoint options. |
native_session | Status and logs, save editor scenes, close. |
native_scene | Tree, properties, get/set/call, pause, input and editor scene operations. |
native_object | Create/load resources and classes; call/get/set singletons and handles. |
native_editor_file | Read, write or delete editor project source files. |
native_step | Advance 1–600 physics ticks, then optionally pause. |
native_capture | Save the native viewport as PNG. |
native_debugger | Breakpoints, stepping, stack, locals, evaluation. |
native_compute | Compile and dispatch a float32 Vulkan compute shader (1–65,535 groups). |
native_project_compile | Compile C# with optional assembly name and local references. |
native_project_recover | Recover project.godot and text resources from project.binary. |
native_extension_initialize | Add and compile the GDExtension starter. |
native_extension_build_default | Build native/build.json for a platform and architecture. |
native_extension_build | Build arbitrary C/C++ sources with language, defines, includes, optimization and entry options. |
native_extension_load | Load a descriptor into a running session. |
native_shader_preview | Compile shader source in the Forward+ Vulkan renderer. |
archive_stage_project | Stage a folder, ZIP64, PCK or embedded pack, with password, key or project path. |
runtime_info | Web compatibility profile versions and sessions. |
runtime_project_inspect | Project configuration and diagnostics without running code. |
runtime_project_create | Write the demo project to a folder. |
runtime_project_open | Import and run a project in the web profile. |
runtime_workspace_project | Convert a level or 3D scene into a native project. |
runtime_session | State, pause, resume, show or close a web session. |
runtime_scene | Inspect the tree, read properties, change scene, set a property. |
runtime_call | Call a node method and await its result. |
runtime_input | Press or release InputMap actions with analog strength. |
runtime_step | Advance physics ticks, then pause. |
runtime_object | Engine classes, singletons and handles. |
runtime_material | Set a ShaderMaterial uniform. |
runtime_capture | Capture the viewport as PNG. |
runtime_pack | Write or inspect a PCK with per-file MD5 hashes. |
runtime_editor_open | Open the persistent web editor. |
runtime_editor_scene | Open, create, edit, save, scan, play and stop editor scenes. |
runtime_editor_file | Read, write or delete editor source files (up to 8 MB). |
runtime_editor_object | Create and save resources; call singletons in the editor. |
runtime_editor_sync | Save 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
.blendfiles. 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_projectand 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
| Language | Where you write it | How it runs | In exported games |
|---|---|---|---|
| GDScript (full engine) | Script workspace (GDScript · full engine) or the native editor | The engine's own GDScript compiler and runtime | All targets |
| GDScript (bounded profile) | Script workspace (GDScript · bounded scene profile) | Isberg Labs' interpreter for a GDScript subset, stepped locally | Transferred as GDScript to native projects |
| C# | Native editor or project files | Bundled Roslyn compiler and .NET 10.0.12 | Windows · integrated .NET runtime only |
| C and C++ | Native project files (native/) | Compiled to a GDExtension with the bundled compiler | Each target, with a per-target binary |
| Lua 5.4 | Script workspace (Lua 5.4 · native / scene worker) | Bundled Lua VM in a worker; Lua GDExtension in the engine | All native targets, nothing to install |
| JavaScript (bounded profile) | Script workspace (JavaScript · bounded scene profile) | Isberg Labs' interpreter for a JavaScript subset | Not transferred to native projects |
| JavaScript (full) | JavaScript editor | V8 in a dedicated worker | JavaScript 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
| Control | What it does |
|---|---|
| Script language | GDScript · 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 source | Load 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 source | Save the editor text as scene-script.gd, scene-script.lua or scene-script.js. |
| Analyze | Report syntax and capability diagnostics with line and column, and list the functions found. Lua uses the real Lua compiler without running the code. |
| Attach | Store source, language and export overrides on the selected node. Attaching does not run the script. Shortcut: Ctrl+Enter in the editor. |
| Run full engine | Attach, then play the level in Game runtime with the real engine (GDScript and Lua). Lua always uses the Windows native profile. |
| Run ready | Start the local runtime and run initialization and ready callbacks. With GDScript · full engine selected it does the same as Run full engine. |
| Step / Step 60 | Advance 1 or 60 local ticks. |
| Step seconds | Tick 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_rightandmove_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
- Open the Script workspace and select a node. Click Refresh scene to pick up the latest level.
- Choose a language, then type code or click Open source. Click Analyze.
- Enter export overrides if needed and click Attach.
- For local stepping, click Run ready, then Step or Step 60. Set input strengths, call methods or emit signals from the inspector.
- Click Reset runtime to discard the simulation, or Apply runtime scene to keep its node changes.
- 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
| Area | Supported |
|---|---|
| Declarations | Variables, constants, functions with default parameters, class_name, known base classes, @export / @onready, type hints (parsed as metadata) |
| Control flow | if/elif/else, while, for/range, typed loop variables, break, continue, return |
| Values | Numbers, 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 |
| Input | Pressed, just pressed, just released, action strength, axis and vector, explicit input events |
| Motion | Position, rotation, scale, degree and global conversions, translate, rotate, look_at, bounded-box move_and_slide and move_and_collide |
| Events | Declared signals, method calls, callable connections, one-shot and repeating timers, standalone await of a timer timeout or signal |
| Resources | preload(key).instantiate() for registered local scene data |
| Helpers | Vector 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.
| Bound | Default |
|---|---|
| Interpreter operations per tick | 50,000 |
| Execution time per tick | about 30 ms |
| Call depth | 32 frames |
| Entries per array or dictionary | 8,192 |
| Pending tasks and timers | 512 |
| Persistent scene and runtime state | 4 MB |
| Source size | 256 KB, 60,000 tokens |
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
.csfile in the project with the bundled Roslyn compiler and the engine's source generators. The assembly name comes from the project'sassembly_namesetting (defaultGame). 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_compilereferences.
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
| Name | Meaning |
|---|---|
self | The attached node. |
get_node(nameOrId), self:get_node(path) | Find another scene node by name, ID or relative path. |
position, rotation, scale, size | Vectors 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, visible | Node properties. |
translate, rotate_x, rotate_y, rotate_z, show, hide | Node methods (call with :). |
get_meta, set_meta, has_meta | Node 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_released | Input actions. |
exports | The node's export overrides. |
state | A 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.
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 withscript_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
| Tool | Purpose |
|---|---|
script_analyze | Compile Lua or parse bounded GDScript/JavaScript from text or a file; no execution. |
script_attach | Attach source and overrides to a level node; profile native keeps full GDScript. |
script_detach | Remove, enable or disable a node script. |
script_step | Advance 1–1,200 steps (0–0.25 s each) with actions and events. |
script_event | Call a method, emit a signal, pause, resume or clear errors. |
script_inspect | Read source metadata, diagnostics and simulation variables without running _ready. |
script_resource | Add, list or remove local prefab scene data. |
script_simulation | Reset or apply the temporary simulation. |
level_playtest | Advance the shared playtest, including attached scripts. |
runtime_workspace_project | Transfer a level with its GDScript and Lua into a native project. |
native_project_compile | Compile C#. |
native_extension_build | Compile 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
| Area | Controls |
|---|---|
| Run bar | ▶ Run, Pause, Step, Stop, Δt (step length, 0–60 seconds, default 0.0166667), Save source project, Load project, Add local assets. |
| Export bar | Export folder, target (Portable Windows game or Web game), Web portable launcher (on by default), Export playable game. |
| Source column | Module 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 column | A 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
}
| Field | Meaning |
|---|---|
entry | The module that starts the game. |
modules | File name to source text. JSON modules are allowed. |
scene, state, input | Initial scene, game state and input. |
assets | Embedded local files, added with Add local assets; read with api.asset(filename). |
timeoutMs | Deadline per request, 20–30,000 ms (default 1,000). |
memoryMb | Worker 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}; }
}
| Member | Description |
|---|---|
api.state | Mutable 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.delta | Simulation seconds, frame index, frame length. |
api.math | clamp, lerp, seeded random and seed, vec3, add, sub, scale, dot, length, normalize. |
api.timers | setTimeout, 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.randomuses a recorded seeded stream.- Dates, clock reads,
Intlresults and local date methods are recorded. - Timers and
performance.now()follow game time;import.meta.urluses stable module names. - Desktop sessions pin your time zone so that local replays repeat. Exported games do not include your time zone.
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
- Enter an empty local folder in the export field.
- Choose Portable Windows game or Web game. For Web, leave Web portable launcher on to add an offline Windows launcher in a
launcherfolder. - 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.
| Target | Result | Saves |
|---|---|---|
| Portable Windows game | An 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 game | index.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.jsonlists the files, modules, assets and a source hash;README.txtexplains how to start the game.
Windows games from the portable release reuse its desktop runtime; see Executable name and branding.
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
| Tool | Purpose |
|---|---|
v8_capabilities | Language profile, APIs and persistence boundaries. |
v8_project_save | Validate and save a source project. |
v8_open | Start a session from a file or modules. |
v8_step | Advance one frame (0–60 s) with input and events. |
v8_call | Call a named export or method. |
v8_call_job | Start or poll a nonblocking async call. |
v8_inspect | Inspect a session or list sessions. |
v8_snapshot | Save or restore explicit JSON scene, state, input and time. |
v8_checkpoint | Save a complete replay checkpoint. |
v8_resume | Restore a checkpoint in a new worker. |
v8_resume_job | Start, poll or cancel a long restore. |
v8_close | End a session. |
v8_export_game | Export 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
launcherfolder. - "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 made | Where you export | Targets |
|---|---|---|
| Native project (Windows native profile) | Game runtime export bar | Windows, macOS, Linux, Android (APK, AAB + APK/APKS), iOS/iPadOS Xcode project, Windows · integrated .NET runtime |
| Project in the Web compatibility profile | Game runtime (Web compatibility) export bar | Web game, Portable Windows game |
| JavaScript project | JavaScript editor | Web game (optional Windows launcher), Portable Windows game |
| RPG Creator project | RPG Creator | Windows, macOS, web folder, single HTML file |
| Level or 3D scene | Transfer to Game runtime first (Playing levels and scenes) | As for native projects |
Targets and supported systems
| Target | Output | Players need | To finish or distribute |
|---|---|---|---|
| Windows | x86_64 executable, .pck game data and libraries | Windows 10/11 x64 | Nothing for GDScript, GDExtension and Lua projects |
| Windows · integrated .NET runtime | Portable folder with Game.exe, the integrated engine and .NET runtime | Windows x64 | Use for C# projects |
| macOS | Universal (Intel and Apple Silicon) app in a ZIP, ad-hoc signed | macOS 15.0 or newer | Developer ID signing and notarization for trusted distribution |
| Linux | x86_64 executable, .pck and libraries | Linux x86_64 with glibc 2.34 or newer | Built on Windows |
| Android | ARM64 APK, or AAB with a universal APK and APK set (.apks) | Android 7.0 (API 24) or newer, ARM64 | Your own keystore for release builds |
| iOS / iPadOS | Complete Xcode project with Lua and C libraries statically linked | iOS / iPadOS 12.0 or newer, ARM64 devices | A Mac with Xcode, your Apple team ID, signing certificate and provisioning |
| Web | Static 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
- Open or create the project in the Windows native profile of Game runtime.
- Choose a target in the export bar: Windows, macOS (Apple), Linux, Android, iOS / iPadOS · Xcode project or Windows · integrated .NET runtime.
- For Android, iOS or macOS, open Mobile / Apple settings and fill in the fields you need.
- Read the status lines under the bar (click Check templates to refresh).
- Set Debug build if you want a debug export. It turns on automatically when you choose Android.
- 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
| Field | Default | Notes |
|---|---|---|
| Application ID | com.gamebench.game | Reverse-domain form; used as the macOS and iOS bundle ID and Android package name. Change it before publishing. |
| Apple team | empty | Required for iOS. |
| Android format | APK | Or App Bundle + APK / APKS. |
| Version code | 1 | Integer 1–2,100,000,000. |
| Version name | 1.0 | One line, up to 100 characters. |
| Android target API | 36 | 24–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 password | empty | For release builds. The password is never saved. |
| Create release key | See Release signing. |
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.
| Check | Result when it fails |
|---|---|
| Bundled export editor and templates present | Setup 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 password | Requirement listed |
| iOS: Apple team ID | "Set the Apple developer team ID for iOS export." |
| Project saved by a newer engine version | Warning; 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.
| Preset | Main settings |
|---|---|
| All | Bundled 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, Linux | x86_64, game data in a separate .pck; Windows does not change the executable's resources and does not code-sign |
| macOS | Universal, bundle ID from Application ID, minimum macOS 15.0, built-in ad-hoc code signing, no notarization |
| Android | No Gradle build, arm64-v8a only, package from Application ID, signed, version code and name |
| iOS | Bundle 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 tool | Version |
|---|---|
| Eclipse Temurin JDK | 17.0.20.1+1 |
| Android SDK Build-Tools | 35.0.1 |
| Android SDK Platform-Tools | 37.0.1 |
| Google bundletool | 1.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.apkfor 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.aabplus a signed universalGame.apkand an APK setGame.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
- Clear Debug build.
- Enter your keystore file, Key alias and Keystore password.
- 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. - Click Export game.
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.
- Enter your Apple team ID in Mobile / Apple settings.
- Export to an empty folder.
- Copy the whole folder to a Mac and open the
.xcodeprojin Xcode. - Build, sign and provision the app with your own Apple credentials.
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
.wasmasapplication/wasm. The README recommendsCross-Origin-Opener-Policy: same-originandCross-Origin-Embedder-Policy: require-corp. - Browsers may wait for a click or key press before playing audio.
Lua, GDExtension and C# in exports
- Lua
- Included by default. The export adds the target's Lua 5.4 library, your
.luafiles 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.
| Target | Checks |
|---|---|
| All engine targets | The 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, Linux | The 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. |
| macOS | The 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. |
| Android | APK 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. |
| iOS | One 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 exports | PCK written with per-file MD5 hashes; its SHA-256 recorded in EXPORT.json. |
| JavaScript exports | File 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
| Tool | Purpose |
|---|---|
native_export | Export a native project for windows-native, windows, macos, linux, android or ios, with title, signing, Android format, version and renderer options. |
native_export_targets | Readiness, requirements and warnings for each target. |
native_export_presets | Write the five built-in presets (existing file kept unless overwrite). |
mobile_export_info | Android APK/AAB tools and iOS prerequisites, without the desktop. |
android_signing_key_create | Create a new RSA 3072 PKCS12 release key. |
android_bundle_build | Convert a compiled APK into a signed, validated AAB with universal APK and APKS. |
native_extension_build_default | Build the GDExtension starter for a target ahead of export. |
runtime_export | Web compatibility export (web or windows) with title and game-area size (128–7680 × 128–4320). |
v8_export_game | JavaScript game export. |
rpg_export_game | RPG 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-gdextensionand 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.jsin the portable folder. It runs inside the bundledIsberg Labs.exein 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
gamebenchand 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/listresponse is authoritative for names, parameters and limits;resources\app\docs\MCP-CAPABILITIES.jsonrecords 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.1and requires a random token written to the portableDatafolder. - 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:
| URI | Content |
|---|---|
gamebench://guide | Pixel-art workflow and anatomy rules (the same text as pixel_guide). |
gamebench://platform | Tool inventory and local transport policy (JSON). |
gamebench://interchange | Supported interchange formats and their compatibility boundaries. |
gamebench://scene3d | 3D scene geometry, skeletal animation and interchange workflows. |
gamebench://javascript | The 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.
- Activate Isberg Labs on this device (in the desktop license window, or with
MCP.cmd --license activate <key>). - 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" } } } } - Restart or reload the client so it starts the server.
- 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
- Keep the portable folder together. The server needs
resources\app, the bundled libraries next toIsberg Labs.exe, and theDatafolder. - Update
command, the path inargsandGAMEBENCH_WORKSPACEin your client configuration to the new location. - 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
| Variable | Effect | Default |
|---|---|---|
ELECTRON_RUN_AS_NODE | Must be 1 so that Isberg Labs.exe runs the server script. | Not set (set by MCP.cmd) |
GAMEBENCH_WORKSPACE | Base 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_PROFILE | Profile 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_STYLES | Folder 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_DIR | Folder 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_CONFIG | Ignored 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.
| Variable | Effect | Default |
|---|---|---|
GAMEBENCH_PROFILE | As above: profile folder for settings, recovery and bridge.json. | The portable Data folder |
GAMEBENCH_PORT | Port 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_CACHE | Folder for temporary media conversion jobs. | The system temporary folder (subfolder gamebench-media) |
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.
| Group | Desktop | Examples |
|---|---|---|
| Engine tools | Not 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 tools | Started 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 tools | Required, 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 exampleworkspace_layout) first to start the hidden desktop, or openIsberg Labs.exeyourself. - If you already have the desktop open with the same
Datafolder, workspace tools operate that window, so you can watch the changes. workspace_windowwith{"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_windowand 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_appopens 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
| ID | Editor |
|---|---|
home | Overview (not a creative editor) |
pixel | Pixel & animation |
texture | Textures & terrain |
maps | World builder |
scene3d | 3D scene & animation |
audio-advanced | Music & composition |
level | Level & playtest |
rpg | RPG Creator |
model | Tile modeler |
mesh | Vertex painter |
materials | Sprite lighting |
audio | Audio workshop |
parameter-sfx | Parameter sound |
sfx | Sound designer |
avatar | Avatar stage |
javascript | JavaScript |
runtime | Game runtime |
interchange | Formats & interchange |
scripts | Script workspace |
shader-graph | Shader graph |
shader | Shader materials |
studio_status lists the same IDs with each editor's title and whether it is loaded.
Discover, run, save
- Discover. Call
workspace_commandswith{"workspace": "sfx"}. It returns every button, input, select and text area withid,label,type(action,select,text,number,range,checkbox,fileand so on), currentvalue,visible,disabled, and where presentmin,max,step,acceptandoptions. Controls without their own element ID get generated IDs such ascontrol-12in discovery order; discover again after the editor reloads. For nested editors, passframe: a CSS selector or an ordered list of up to 8 selectors. - Run. Call
workspace_executewith 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; useworkspace_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) oroutDir(folder plus the editor's suggested file name): where save dialogs and downloads are written. An export without either fails withSupply 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).
{"id", "pending", "outputs": [{"path", "bytes"}], "error"}. Only one file operation runs at a time. - Import. To feed files into a specific file control (image, video, soundtrack, reference, layout or project inputs), call
workspace_importwithworkspace,control,filesand optionallymimeType. - Finish long exports. If
pendingistrue, callworkspace_file_jobwith{"id": "…"}untiloutputslists your files. Pass"finish": trueto release the capture. Files are written locally; nothing is uploaded. - Save one editor.
workspace_savewrites an editor's complete state to a local JSON file (for the World builder, all initialized subeditors).workspace_openrestores it (state files up to 256 MB). An editor without a state adapter answersUse this editor’s project save/open controls through the UI tools. - Save the whole project.
studio_project_statewithout arguments reads the shared project (supported editor states and the asset shelf); withvalueit replaces it. For a portable.isbergfile, useworkspace_project_saveandworkspace_project_open: the application writes and reads the file itself, so large embedded assets do not travel over MCP. - 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 without).
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_layoutreads or replaces the whole layout: dock tree, floating windows back to front, bounds, minimized states, focus and the maximized group.workspace_docktakesactionopen,close,split(withdirectionroworcolumn),move(withgroup),float,bounds(withx,y,widthof at least 80 andheightof at least 60),focus,minimize,restore,maximizeorcascade. 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 portableProjectsfolder), 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.pngare accepted and converted. - Network and remote paths are refused: UNC paths (
\\server\share), paths starting with//, and URLs such ashttp://orfile://. The error isUse 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-historyfolder next to the file (one subfolder per file, the last 50 snapshots).pixel_undowithpathand optionalstepsrestores them. - Reference formats stay intact. Editing an
.aseprite,.aseor.pforgefile withoutoutwrites a sibling.isbspriteand reports its path. - Layer, frame and selection targeting. Image tools that take a
pathalso acceptlayer,frameandselectto edit one cel of an.isbspriteor only a selected area. Edits to multi-layer sprites needlayer. 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).
| Item | Purpose |
|---|---|
license.json, license.lock, license-retry.json | Device activation, the cross-process lock and the retry schedule (moved by ISBERG_LICENSE_DIR). |
bridge.json | Port, token and process ID of the running desktop. Present only while the desktop runs. |
recovery\workspace.isberg | Automatic recovery project written when the desktop closes. |
desktop-windows.json | Positions of detached editor windows. |
styles, palettes, scripts, lua-plugins | Desktop style cards, palettes, scripts and installed Lua extensions. |
Runtime, NativeRuntime, NativeCompiler, ProjectBlobs | Caches 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.
| Work | Start | Poll, finish or cancel |
|---|---|---|
| Editor export through named controls | workspace_execute (result has pending: true) | workspace_file_job {"id"}; "finish": true releases the capture |
| Full project save or open | workspace_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 WebM | scene3d_render {"out", "format": "frames" | "webm"} | scene3d_render_status {"id"}; "finish": true |
| Music render or PCM processing | audio_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 synthesis | parameter_sound_job {"op": "start", "file", "out"} | Same tool with op status, cancel or list |
| Asynchronous JavaScript method | v8_call_job {"session", "action": "start", "name", "args"} | Same tool with action: "status" and id |
| JavaScript checkpoint replay | v8_resume_job {"action": "start", "file"} | Same tool with action status or cancel |
| Lua script with dialogs in the Pixel editor | pixel_lua_ui {"action": "begin", …} | Same tool with action status or cancel and jobId |
workspace_project_saveandworkspace_project_openstart 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,.crocotileand.c3dpcannot 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
overwriteparameter refuse an existing output (Output already existsorDestination already exists) unless you pass"overwrite": true. This includesasset_importandproject_unpack.native_export_presetskeeps an existingexport_presets.cfgunlessoverwriteis true.android_signing_key_createnever replaces a key. - Game exports need an empty destination.
native_export,runtime_export,v8_export_gameandrpg_export_gamewrite 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-historyfirst. - 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_searchandproject_packskip symbolic links,.git,node_modulesand.gamebench-history.project_unpackchecks 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_precisiontools 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.
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
| Item | Limit |
|---|---|
| Desktop request / response | 16 MB / 32 MB, 30 seconds per request |
workspace_open state file | 256 MB |
| Avatar and tile-model JSON read by tools; level projects | 128 MB |
asset_import file | 192 MB |
project_pack | 2,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 sources | Up 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 lights | 16 |
workspace_execute | 100 input files; waitMs 100 to 20,000 |
| Image edit history | 50 snapshots per file |
| Level edit history | 20 undo and 20 redo steps |
rpg_playtest sessions | 16 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.
| Tool | What it returns |
|---|---|
studio_capabilities | All tool names, the count, categories and the local-only policy. |
pixel_guide | Pixel-art workflows, targeting rules and anatomy rules. Read this first for sprite work. |
pixel_knowledge | Knowledge base topics craft, animation, tiles, cleanup, critique and pxl; no topic lists them. |
studio_status | The running desktop, active editor and editor IDs (needs a running desktop). |
workspace_commands | Every control, range, option and file input of one editor. |
workspace_game_presets | Game-style recipes and their effect in each editor. |
interchange_capabilities | Import and export domains, diagnostics and known unsupported features. |
scene3d_modeling_info, scene3d_native_info | 3D modeling capabilities; native tile-project actors, actions and behaviors. |
scene_painter_info | Scene painter targets, masks, clips and snapshots. |
asset_document_adapters | Which editable documents convert between which editors, with options and diagnostics. |
surface_calibration | Material controls, units, defaults and evidence limits. |
pixel_lua_capabilities | The bundled Lua 5.4 interpreter and its partial host API. |
v8_capabilities | The JavaScript language profile, modules and runtime APIs. |
runtime_info, native_runtime_info | Bundled engine profiles, versions, compilers, render profiles and active sessions. |
native_export_targets, mobile_export_info | Export templates, platform prerequisites and Android or iOS readiness. |
rpg_diagnostics | RPG 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.
| Family | Tools | Start with | Covers |
|---|---|---|---|
pixel_ | 50 | pixel_guide | Sprite and image inspection, drawing, selections, grid repair, anatomy repair, critique, palettes, transforms, indexed and high-precision editing, Lua scripts and Lua extensions |
anim_ | 12 | anim_view | Sheet animation: view, fix jitter, timing presets, walk cycles, puppets, effects, slicing, validation, GIF |
spec_ | 2 | spec_template | Character specs as JSON rendered to shaded layers |
lpc_ | 2 | lpc_export | LPC universal sheets |
style_ | 3 | style_list | Style study and style cards |
pxl_ | 8 | pxl_build | PXL pixel art as code, plus lighting, normals, glow and shading |
fx_ | 7 | fx_filter | Filters, whole-sprite transforms, cleanup pipelines, recipes, palette-swap variants |
palette_ | 4 | palette_ramp | Ramps, palette files, palettes from references, palette usage |
project_ | 7 | project_info | Sprite project structure and conversion; .isbundle pack and unpack |
io_ | 5 | io_export | Image export, sprite sheets, sheet and sequence import, batch recipes |
texture_ | 2 | texture_fill | Procedural pixel textures and scattering |
autotile_ | 1 | autotile_generate | 16-tile and 47-tile autotile sets |
tileset_ | 1 | tileset_extract | Tileset and Tiled map from a level image |
tilemap_ | 1 | tilemap_render | Render a Tiled .tmj map to PNG |
slices_ | 2 | slices_edit | Slices and 9-slice export |
video_ | 1 | video_to_pixel | Video or animated GIF/WebP to pixel animation |
material_ | 2 | material_generate | Sprite lighting maps and lit renders |
surface_ | 11 | surface_generate | Full material maps, calibrated profile, presets, material projects, previews |
sfx_ | 2 | sfx_generate | Retro sound effects |
audio_ | 4 | audio_catalog | Procedural audio presets and scenes, PCM processing, render jobs |
music_ | 10 | music_project | Compositions: tracks, notes, samples, automation, effects, MIDI, tempo maps |
parameter_ | 7 | parameter_sound_project | Parameter sound documents, controls, variations and worker synthesis |
media_ | 1 | media_encode_audio | WAV to MP3, Ogg Vorbis or FLAC |
avatar_ | 17 | avatar_create | Layered avatar rigs, motion, expressions, signal, PNG output |
model_ | 3 | model_create | Tile models: create, edit, export |
mesh_ | 13 | mesh_create | Vertex painter meshes: brushes, channels, normals, topology, snapshots |
scene_ | 13 | scene_painter_open | Scene painter for exported scenes |
scene3d_ | 33 | scene3d_create | 3D scenes: objects, geometry, materials, bones, skinning, animation, rigging, modeling, tile projects, render |
interchange_ | 9 | interchange_capabilities | FBX, Collada, glTF, PLY, STL, OBJ, TMX and native tile import and export |
level_ | 10 | level_create | Levels, objects, settings, preflight, playtest, export |
script_ | 8 | script_analyze | Lua, GDScript and JavaScript scene scripts |
shader_ | 13 | shader_create | Shader materials and visual shader graphs, GPU compile and preview |
runtime_ | 20 | runtime_info | Full engine projects, sessions, native editor authoring, capture, Windows and Web export |
native_ | 20 | native_runtime_info | Windows native engine, C#, C/C++ extensions, debugger, compute, platform export |
mobile_ | 1 | mobile_export_info | Android and iOS readiness |
android_ | 2 | android_bundle_build | Release keys and App Bundles |
v8_ | 13 | v8_capabilities | JavaScript sessions, checkpoints and game export |
rpg_ | 8 | rpg_project | RPG Creator projects, import and export, characters, playtest |
world_ | 3 | world_editor | World builder subeditors |
archive_ | 4 | archive_inspect | ZIP/ZIP64 and PCK inspection, extraction and project staging |
asset_ | 10 | asset_documents | Shared editable documents, dependencies, asset search and import |
workspace_ | 18 | workspace_commands | Desktop editor commands, files, projects, layout, history, presets |
studio_ | 12 | studio_status | Desktop status, inspection, low-level control, capture, project state |
Troubleshooting
- The client shows no tools or reports that the server exited
- Check that
commandandargspoint at your folder, that backslashes are doubled in JSON, and thatELECTRON_RUN_AS_NODEis1. 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. RunMCP.cmd --license statusto see the reason. If you setISBERG_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 sameDatafolder (or the sameGAMEBENCH_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": truewhere the tool offers it. Game exports need an empty folder. - "A file operation is already running"
- Finish the earlier export with
workspace_file_joband"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
stylesfolder of the same profile. If you start the studio withGAMEBENCH_PROFILE, give the MCP server the same value (or setGAMEBENCH_STYLES, or passdirto the style tools). - A hidden Isberg Labs process keeps running
- Call
workspace_windowwith{"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.
| Family | Area | Tools |
|---|---|---|
studio_* | Studio control: inspect and operate the desktop UI | 12 |
workspace_* | Workspace: editor commands, projects, layout, presets and recovery | 18 |
asset_* | Shared project assets and editable documents | 10 |
archive_* | ZIP and PCK archives | 4 |
pixel_* | Pixel art: drawing, analysis, repair, Lua and plugins | 50 |
project_* | Sprite projects (.isbsprite): layers, frames, color modes, packing | 7 |
palette_* | Palettes | 4 |
style_* | Art styles | 3 |
spec_* | Sprite specs and templates | 2 |
pxl_* | PXL art as code | 8 |
lpc_* | LPC character parts | 2 |
slices_* | Slices | 2 |
anim_* | Sprite animation and sheets | 12 |
fx_* | Image effects and filters | 7 |
io_* | Image import/export and sprite sheets | 5 |
video_* | Video to pixel art | 1 |
texture_* | Texture fill and scatter | 2 |
tileset_* | Tilesets | 1 |
tilemap_* | Tilemaps | 1 |
autotile_* | Autotiles | 1 |
surface_* | Sprite lighting surfaces and material projects | 11 |
material_* | Material maps | 2 |
scene_* | Scene painter (.isbscene) | 13 |
world_* | World builder | 3 |
level_* | Level & playtest | 10 |
scene3d_* | 3D scene & animation | 33 |
model_* | Tile models (.isbtiles) | 3 |
mesh_* | Vertex painter meshes | 13 |
interchange_* | Formats & interchange | 9 |
music_* | Music & composition | 10 |
audio_* | Audio processing and rendering | 4 |
parameter_* | Parameter sound (.isbsound) | 7 |
sfx_* | Sound designer | 2 |
media_* | Audio encoding | 1 |
avatar_* | Avatar stage (.isbavatar) | 17 |
rpg_* | RPG Creator (.isbrpg) | 8 |
script_* | Scene scripts | 8 |
v8_* | JavaScript (V8) runtime and export | 13 |
shader_* | Shader graph and shader materials | 13 |
runtime_* | Game runtime: projects, editor, sessions and export | 20 |
native_* | Native engine: projects, extensions, debugger and export | 20 |
mobile_* | Mobile export information | 1 |
android_* | Android signing and bundles | 2 |
| Total | 375 | |
…_job and status 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)
Inspect the running local desktop platform, active workspace and available workspace identifiers.
No parameters.
Switch to a named integrated desktop workspace.
Parameters (1) · required: workspace
| Parameter | Type | Description |
|---|---|---|
workspace required | string min length 1, max length 80 |
Inspect visible controls and state in an integrated editor. Pass frame selector(s) to inspect nested local editor frames.
Parameters (4)
| Parameter | Type | Description |
|---|---|---|
workspace | string max length 80 | |
frame | string or array of string | |
selector | string max length 1024 | |
limit | integer 1–500 |
Click a named CSS control in an integrated editor. Supports nested frame selectors; cannot execute arbitrary code.
Parameters (3) · required: selector
| Parameter | Type | Description |
|---|---|---|
workspace | string max length 80 | |
frame | string or array of string | |
selector required | string min length 1, max length 1024 |
Fill a text, number, range or checkbox control and dispatch its normal input/change events.
Parameters (4) · required: selector, value
| Parameter | Type | Description |
|---|---|---|
workspace | string max length 80 | |
frame | string or array of string | |
selector required | string min length 1, max length 1024 | |
value required | string or number or boolean |
Select a native dropdown option in an integrated editor.
Parameters (4) · required: selector, value
| Parameter | Type | Description |
|---|---|---|
workspace | string max length 80 | |
frame | string or array of string | |
selector required | string min length 1, max length 1024 | |
value required | string max length 4096 |
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
| Parameter | Type | Description |
|---|---|---|
workspace | string max length 80 | |
frame | string or array of string | |
selector required | string min length 1, max length 1024 | |
event required | "pointerdown" | "pointermove" | "pointerup" | "mousedown" | "mousemove" | "mouseup" | "click" | "wheel" | "keydown" | "keyup" | |
x | number -100000–100000 | |
y | number -100000–100000 | |
button | integer 0–2 | |
buttons | integer 0–7 | |
deltaY | number -10000–10000 | |
key | string max length 40 | |
shiftKey | boolean | |
ctrlKey | boolean | |
altKey | boolean |
Capture the running local desktop workspace for visual verification. Optionally save its PNG locally.
Parameters (4)
| Parameter | Type | Description |
|---|---|---|
workspace | string max length 80 | |
frame | string or array of string | |
selector | string max length 1024 | |
out | string min length 1 |
Publish a local image into the shared platform asset shelf or send it to an integrated workspace.
Parameters (3) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
workspace | string max length 80 | |
name | string max length 200 |
Read or replace a workspace state through its structured local state adapter. No script evaluation is exposed.
Parameters (2)
| Parameter | Type | Description |
|---|---|---|
workspace | string max length 80 | |
value | map of any |
Read or replace the complete shared local project state, including supported workspace states and the asset shelf.
Parameters (1)
| Parameter | Type | Description |
|---|---|---|
value | map of any |
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)
List game-style recipes and their concrete effect in all nineteen editors. Selecting a recipe does not modify content.
No parameters.
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
| Parameter | Type | Description |
|---|---|---|
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" | |
seed | integer 0–4294967295 |
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)
| Parameter | Type | Description |
|---|---|---|
action | "inspect" | "undo" | "redo" | "clear" |
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 |
Open a full portable unified project from disk, restoring its embedded editor resources and layout.
Parameters (1) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 |
Begin a streamed full project save/open without blocking MCP. Poll workspace_project_job for progress, completion or cancellation.
Parameters (2) · required: action, file
| Parameter | Type | Description |
|---|---|---|
action required | "save" | "open" | |
file required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
id required | string | |
cancel | boolean |
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
| Parameter | Type | Description |
|---|---|---|
action required | "inspect" | "blob_import" | "blob_export" | |
file required | string min length 1 | |
reference | object |
Show or hide the bundled editor window; hidden engine sessions can be made visible without launching another tool.
Parameters (1) · required: show
| Parameter | Type | Description |
|---|---|---|
show required | boolean |
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)
| Parameter | Type | Description |
|---|---|---|
value | map of any |
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
| Parameter | Type | Description |
|---|---|---|
action required | "open" | "close" | "split" | "move" | "float" | "bounds" | "focus" | "minimize" | "restore" | "maximize" | "cascade" | |
workspace | string min length 1, max length 80 | |
direction | "row" | "column" | |
group | string | |
x | number -100000–100000 | |
y | number -100000–100000 | |
width | number 80–100000 | |
height | number 60–100000 |
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)
| Parameter | Type | Description |
|---|---|---|
restore | boolean |
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
| Parameter | Type | Description |
|---|---|---|
workspace required | string min length 1, max length 80 | |
frame | string or array of string |
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
| Parameter | Type | Description |
|---|---|---|
workspace required | string min length 1, max length 80 | |
frame | string or array of string | |
action | string | |
values | map of string or number or boolean | |
files | array of string max 100 items | |
out | string min length 1 | |
outDir | string min length 1 | |
overwrite | boolean | |
waitMs | integer 100–20000 |
Import local files into a named editor file control, including image, video, soundtrack, reference, layout and project inputs.
Parameters (5) · required: workspace, control, files
| Parameter | Type | Description |
|---|---|---|
workspace required | string min length 1, max length 80 | |
frame | string or array of string | |
control required | string min length 1 | |
files required | array of string min 1 items, max 100 items | |
mimeType | string |
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
| Parameter | Type | Description |
|---|---|---|
id required | string | |
finish | boolean |
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
| Parameter | Type | Description |
|---|---|---|
workspace required | string min length 1, max length 80 | |
out required | string min length 1 |
Restore a complete editor state from a local JSON file.
Parameters (2) · required: workspace, file
| Parameter | Type | Description |
|---|---|---|
workspace required | string min length 1, max length 80 | |
file required | string min length 1 |
Assets, documents and archives
Share editable documents between editors and unpack archives.
asset_* · Shared project assets and editable documents (10)
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)
| Parameter | Type | Description |
|---|---|---|
source | string | |
target | string |
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)
| Parameter | Type | Description |
|---|---|---|
id | string min length 1 | |
includeState | boolean |
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
| Parameter | Type | Description |
|---|---|---|
workspace required | string min length 1 | |
id | string min length 1 | |
name | string |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
workspace required | string min length 1 | |
mode | "linked" | "copy" | |
force | boolean | |
options | map of object |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
workspace required | string min length 1 | |
name | string | |
id | string min length 1 |
Export an editable asset payload directly to a local JSON file.
Parameters (2) · required: id, out
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
out required | string min length 1 |
Set explicit asset dependencies; detects missing references and refuses dependency cycles.
Parameters (2) · required: id, dependencies
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
dependencies required | array of string max 1024 items |
Remove a shared project asset. Referenced assets require force; file contents outside the project are never deleted.
Parameters (2) · required: id
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
force | boolean |
Search local project assets without networking. Skips symbolic links, .git, dependencies and history; reports the scan boundary.
Parameters (4) · required: root
| Parameter | Type | Description |
|---|---|---|
root required | string min length 1 | |
query | string | |
extensions | array of string | |
limit | integer 1–500 |
Copy a local file into a project asset folder, without replacing existing files unless overwrite is true.
Parameters (4) · required: source, root, name
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
root required | string min length 1 | |
name required | string min length 1 | |
overwrite | boolean |
archive_* · ZIP and PCK archives (4)
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
format required | "zip" | "pck" | |
key | string | |
offset | integer ≥ 0 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
prefix | string | |
password | string | |
overwrite | boolean | |
maxEntrySize | integer > 0 | |
maxTotalSize | integer > 0 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
key | string | |
offset | integer ≥ 0 | |
sparseRoot | string min length 1 | |
overwrite | boolean | |
maxTotalSize | integer > 0 |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
profile | "native" | "web" | |
key | string | |
password | string | |
projectPath | string |
Pixel art and sprites
Draw, analyse, repair and script pixel art and sprite projects.
pixel_* · Pixel art: drawing, analysis, repair, Lua and plugins (50)
Read the Isberg workflow and anatomy rules for fixing image pixel art (hands, feet, faces, limbs, animation). Read this first.
No parameters.
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
region | object | |
zoom | integer 1–48 | |
grid | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Show two images side by side (e.g. original vs fixed).
Parameters (2) · required: before, after
| Parameter | Type | Description |
|---|---|---|
before required | string | |
after required | string |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
region | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
x required | integer | |
y required | integer | |
rows required | array of string | |
legend required | map of string | |
out | string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Set individual pixels.
Parameters (6) · required: path, pixels
| Parameter | Type | Description |
|---|---|---|
path required | string | |
pixels required | array of object | |
out | string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
ops required | array of map of any | |
out | string | |
palette | string or array of string | palette for shading ink / snap: preset name or hex list (default: the project palette, else the image colors) |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
select required | any | selection spec (see the select parameter of editing tools) |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
Create a new blank (or filled) canvas.
Parameters (4) · required: path, width, height
| Parameter | Type | Description |
|---|---|---|
path required | string | |
width required | integer > 0 | |
height required | integer > 0 | |
background | string | Hex color like "#1a1020", or "transparent" |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
refine | "dp" | "greedy" | "none" | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out required | string | |
scale | "auto" or number | fake pixel size; "auto" detects it |
offsetX | number | |
offsetY | number | |
removeBackground | boolean | |
bgTolerance | number | |
maxColors | integer 0–256 | |
mergeThreshold | number ≥ 0 | |
palette | string or array of string | preset name (pico-8, sweetie-16, endesga-32, resurrect-32, gameboy, nes) or hex list |
orphans | boolean | |
outline | boolean | |
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) |
snapRadius | number 0.05–0.5 | max line deviation as a fraction of a cell (default 0.3) |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
ops required | array of "remove_orphans" | "repair_outline" | "pixel_perfect" | "add_outline" | "remove_background" | "majority" | "merge_colors" | "harden_alpha" | |
outlineColor | string | Hex color like "#1a1020", or "transparent" |
tolerance | number | |
protectContrast | number | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
action required | "list" | "preview" | |
name | string | |
params | map of any | |
ramp | map of string |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
name required | string | hand_open | fist | foot | eye | mouth | head |
params | map of any | |
x required | integer | |
y required | integer | |
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} |
rampRegion | object | |
baseColor | string | Hex color like "#1a1020", or "transparent" |
flipH | boolean | |
scale | integer 1–8 | |
eraseRegion | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
x0 required | number | |
y0 required | number | |
x1 required | number | |
y1 required | number | |
thickness required | number 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} |
rampRegion | object | |
baseColor | string | Hex color like "#1a1020", or "transparent" |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
direction required | "left-to-right" | "right-to-left" | |
axisX | number | |
region | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
src required | object | |
dstX required | integer | |
dstY required | integer | |
mirror | boolean | |
clearSource | boolean | |
clearDest | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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 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
| Parameter | Type | Description |
|---|---|---|
path | string | |
out | string | |
action required | "extract" | "apply" | "swap" | "reduce" | "presets" | |
colors | integer 2–256 | |
palette | string or array of string | |
pairs | array of array of any | |
dither | "none" | "bayer2" | "bayer4" | "floyd" | |
tolerance | number | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Convert any image (photo, render, illustration) to pixel art: downsample, palette (auto or preset), dithering, outline.
Parameters (16) · required: path, out
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out required | string | |
width | integer > 0 | |
pixelSize | number > 0 | |
method | "mode" | "average" | "nearest" | "median-luma" | |
colors | integer 2–256 | |
palette | string or array of string | |
dither | "none" | "bayer2" | "bayer4" | "floyd" | |
strength | number 0–1 | |
outline | boolean or string | |
contrast | number | |
saturation | number | |
brightness | number | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
op required | "rotate" | "flip_h" | "flip_v" | "rotate90" | "scale2x" | "upscale" | "downscale" | "crop" | "trim" | "resize_canvas" | "shift" | |
degrees | number | |
factor | integer 1–32 | |
region | object | |
width | integer | |
height | integer | |
anchor | string | |
dx | integer | |
dy | integer | |
wrap | boolean | |
clockwise | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out required | string | |
quad required | array of array of any min 4 items, max 4 items | |
width required | integer > 0 | |
height required | integer > 0 | |
seamless | boolean | |
pixelizeWidth | integer > 0 | |
colors | integer | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Restore the previous version of a file (from automatic history snapshots).
Parameters (2) · required: path
| Parameter | Type | Description |
|---|---|---|
path required | string | |
steps | integer ≥ 1 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Image or project file |
out | string | Where to write the result (default: overwrite path). If the image grid snap changes the size, write to an image file. |
steps | array of "grid" | "isolate" | "pairs" | "noise" | "outline" | "replace" | Which steps to run (default all except none); e.g. ["pairs","noise"] |
replaceAll | boolean | Rebuild every detected hand procedurally, not only hopeless ones |
handStyle | "fist" | "hand_open" | Procedural hand style for rebuilt hands (default fist) |
forcePairs | boolean | Mirror paired parts even when neither is clearly better |
dryRun | boolean | Report + preview only, write nothing |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Image or project file |
kinds | array of "hand" | "foot" | "eye" | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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)
| Parameter | Type | Description |
|---|---|---|
topic | string |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
target | object |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
target | object | |
action required | "set" | "remove" | "clear" | |
name | string | |
extension | string min length 1 | |
property | object |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Image or project file (.png/.webp/.gif/.isbsprite) |
frame | integer ≥ 0 | |
region | object | Crop before viewing (max 128x128) |
layer | integer ≥ 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. |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Image 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) |
frame | integer ≥ 0 | |
layer | integer ≥ 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. |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Image or project file (.png/.webp/.gif/.isbsprite) |
out required | string | Output PNG path |
scale | integer 1–32 | |
frame | integer ≥ 0 | |
allowFix | boolean | Export even if the critique verdict is FIX (state why) |
layer | integer ≥ 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. |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string | |
action required | "inspect" | "assign" | "convert" | "preview" | |
profile | "srgb" | "p3" default "srgb" | |
iccFile | string |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string | |
resources | map of string |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string | |
action required | "inspect" | "paint" | "palette" | "synchronize" | |
frame | integer ≥ 0, default 0 | |
layer | integer ≥ 0, default 0 | |
pixels | array of object max 1000000 items | |
index | integer 0–255 | |
color | string | |
name | string | |
x | integer ≥ 0 | |
y | integer ≥ 0 |
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.
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)
| Parameter | Type | Description |
|---|---|---|
file | string min length 1 | Input .isbsprite, legacy .pforge/.aseprite import, or image; optional when source constructs a new Sprite |
out | string min length 1 | Output .isbsprite/PNG/GIF; defaults to file, or .isbsprite for a legacy/reference input |
source | string max length 4194304 | |
scriptFile | string min length 1 | |
params | map of string or number or boolean | |
timeoutMs | integer 50–30000 | |
activeFrame | integer ≥ 1 | |
activeLayer | integer ≥ 1 |
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)
| Parameter | Type | Description |
|---|---|---|
action | "run" | "begin" | "status" | "cancel" default "run" | |
source | string max length 4194304 | |
scriptFile | string min length 1 | |
params | map of string or number or boolean | |
jobId | string | |
timeoutMs | integer 50–25000 |
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
| Parameter | Type | Description |
|---|---|---|
packagePath required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
packagePath required | string min length 1 | |
file | string min length 1 | Optional replacement current document; otherwise use the session document. |
activeFrame | integer ≥ 1 | |
activeLayer | integer ≥ 1 | |
params | map of string or number or boolean | |
foreground | array of integer min 4 items, max 4 items | |
background | array of integer min 4 items, max 4 items | |
timeoutMs | integer 50–30000 | |
preferences | map of object | |
preferencesFile | string min length 1 | Read a bounded local JSON preferences object; mutually exclusive with preferences. |
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
| Parameter | Type | Description |
|---|---|---|
sessionId required | string min length 1 | |
commandId required | string min length 1 | |
file | string min length 1 | Optional replacement current document; otherwise use the session document. |
activeFrame | integer ≥ 1 | |
activeLayer | integer ≥ 1 | |
params | map of string or number or boolean | |
foreground | array of integer min 4 items, max 4 items | |
background | array of integer min 4 items, max 4 items | |
timeoutMs | integer 50–30000 |
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)
| Parameter | Type | Description |
|---|---|---|
sessionId | string min length 1 | |
refresh | boolean default false | |
file | string min length 1 | Optional replacement current document; otherwise use the session document. |
activeFrame | integer ≥ 1 | |
activeLayer | integer ≥ 1 | |
params | map of string or number or boolean | |
foreground | array of integer min 4 items, max 4 items | |
background | array of integer min 4 items, max 4 items | |
timeoutMs | integer 50–30000 |
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
| Parameter | Type | Description |
|---|---|---|
sessionId required | string min length 1 | |
out | string min length 1 | Editable .isbsprite output for the active sprite. |
preferencesOut | string min length 1 | Local .json output containing the current plugin preferences. |
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
| Parameter | Type | Description |
|---|---|---|
sessionId required | string min length 1 | |
out | string min length 1 | Editable .isbsprite output for the active sprite. |
preferencesOut | string min length 1 | Local .json output containing the current plugin preferences. |
timeoutMs | integer 50–30000 |
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
| Parameter | Type | Description |
|---|---|---|
action required | "load" | "list" | "invoke" | "begin" | "status" | "refresh" | "unload" | "dialogs" | "dialog-event" | "dialog-begin" | |
packagePath | string min length 1 | |
name | string min length 1 | |
commandId | string min length 1 | |
jobId | string min length 1 | |
dialogId | integer > 0 | |
widgetId | string min length 1 | |
widgetIndex | integer 1–256 | |
event | "click" | "change" | "close" | "mousedown" | "mouseup" | "mousemove" | "dblclick" | "wheel" | "keydown" | "keyup" | |
colorIndex | integer 1–256 | |
button | integer 0–31 | |
x | number -10000000–10000000 | |
y | number -10000000–10000000 | |
pressure | number 0–1 | |
deltaX | number | |
deltaY | number | |
key | string max length 256 | |
code | string max length 64 | |
repeatCount | integer 0–65535 | |
altKey | boolean | |
ctrlKey | boolean | |
metaKey | boolean | |
shiftKey | boolean | |
spaceKey | boolean | |
data | map of object | |
timeoutMs | integer 50–25000 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string | |
out | string | |
action | "inspect" | "enable" | "read" | "paint" | "fill" | "exposure" | "float" | "display" | "uint8" default "inspect" | |
mode | "uint16" | "float32" | |
frameIndex | integer ≥ 0, default 0 | |
layerIndex | integer ≥ 0, default 0 | |
x | integer ≥ 0, default 0 | |
y | integer ≥ 0, default 0 | |
width | integer ≥ 1, default 1 | |
height | integer ≥ 1, default 1 | |
rgba | array of number min 4 items, max 4 items | |
stops | number -24–24, default 0 | |
exposure | number -24–24, default 0 | |
toneMap | "clip" | "reinhard" default "clip" |
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
| Parameter | Type | Description |
|---|---|---|
file required | string | |
out required | string | |
frameIndex | integer ≥ 0, default 0 | |
encoding | "source" | "srgb" | "linear" | "pq" | "hlg" |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string | |
action required | "inspect" | "set" | "preview" | |
frame | integer ≥ 0, default 0 | |
layer | integer ≥ 0, default 0 | |
bounds | object | |
scale | number > 0, ≤ 64, default 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
frame | integer ≥ 0, default 0 | |
layer | integer ≥ 0, default 0 | |
rect | object | |
action | "copy" | "cut" default "copy" | |
clipboardOut required | string min length 1 | |
out | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
clipboardFile required | string min length 1 | |
file | string min length 1 | |
out | string min length 1 | |
frame | integer ≥ 0, default 0 | |
layer | integer ≥ 0, default 0 | |
as | "cells" | "layer" | "sprite" default "cells" | |
x | integer -1048576–1048576 | |
y | integer -1048576–1048576 | |
snap | boolean default false | |
flipX | boolean default false | |
flipY | boolean default false | |
turns | integer -3–3, default 0 | |
name | string max length 200 |
project_* · Sprite projects (.isbsprite): layers, frames, color modes, packing (7)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
mode required | "rgb" | "indexed" | "grayscale" | |
palette | array of string or string | |
colors | integer 2–256 | indexed without palette: extract this many colors (default 32) |
levels | integer 2–256 | grayscale levels (default 256 = no quantization) |
dither | "none" | "bayer2" | "bayer4" | "floyd" | |
strength | number 0–1 | |
out | string | |
frameWidth | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames) |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames) |
out required | string | |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 |
Render one frame (composited with blend modes/opacity/groups, or a single layer) zoomed with a pixel grid.
Parameters (6) · required: path
| Parameter | Type | Description |
|---|---|---|
path required | string | Project file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames) |
frame | integer ≥ 0 | |
layer | integer ≥ 0 | |
region | object | |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project file: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), or an image (.png/.gif/.webp; animated → frames) |
out | string | |
ops required | array of map of any | |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 |
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
| Parameter | Type | Description |
|---|---|---|
root required | string min length 1 | |
out required | string min length 1 | |
files | array of string max 2000 items |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
root required | string min length 1 | |
overwrite | boolean |
palette_* · Palettes (4)
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
| Parameter | Type | Description |
|---|---|---|
base required | string | Base color hex |
steps | integer 1–32 | default 5 |
hueShift | number 0–180 | max hue rotation in degrees, default 14 |
dark | number 0–1 | how dark the darkest step gets, default 0.40 |
light | number 0–1 | how light the lightest step gets, default 0.80 |
out | string | Optional palette file to write (.gpl/.hex/.pal/.act) |
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
| Parameter | Type | Description |
|---|---|---|
action required | "read" | "write" | |
path | string | read: file to parse |
colors | array of string | Palette as hex colors ["#1a1c2c", ...] |
from | string | write: take colors from this palette file / image / project / preset |
names | array of string | write .gpl: entry names (roles) |
name | string | palette name (.gpl) |
out | string | write: output file .gpl/.hex/.pal/.act |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Reference image (or project) |
colors | integer 1–256 | N, default 16 |
out | string | Optional .gpl/.hex/.pal/.act |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
palette | array of string or string | |
frameWidth | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
name required | string | |
notes | array of string | |
dir | string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
List saved style cards (name, palette, notes); with name returns that card's prompt text to follow when drawing.
Parameters (2)
| Parameter | Type | Description |
|---|---|---|
name | string | |
dir | string |
spec_* · Sprite specs and templates (2)
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)
| Parameter | Type | Description |
|---|---|---|
spec | map of any or string | |
file | string | .json / .pfspec.json spec file |
out | string | .isbsprite/.png (sheet + json)/.gif |
zoom | integer 1–16 |
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
| Parameter | Type | Description |
|---|---|---|
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" | |
size | integer 16–128 | height in px (width follows the preset ratio) |
colors | map 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" | |
out | string | save the spec JSON here (.json) |
render | string | also render to this project/PNG |
walkSet | string | save a 4-direction walk set project here (.isbsprite/.png/.gif) |
pxl_* · PXL art as code (8)
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)
| Parameter | Type | Description |
|---|---|---|
path | string | Art file (.px.js). Relative paths resolve against the workspace. |
source | string | Inline PXL source instead of a file (include() resolves against the workspace). |
out | string | Output dir (default <art dir>/out, or <workspace>/pxl-out for inline) |
only | array of string | Only these assets/sheets (fast iteration) |
seed | integer | |
scale | integer > 0 | Fixed preview scale |
previews | integer 0–12 | How many preview images to return (default 4) |
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
| Parameter | Type | Description |
|---|---|---|
path | string | Art file (.px.js). Relative paths resolve against the workspace. |
source | string | Inline PXL source instead of a file (include() resolves against the workspace). |
name required | string |
List the assets (sprite/scene/anim, parts start with "_"), groups and sheets of a PXL file with their file:line locations.
Parameters (2)
| Parameter | Type | Description |
|---|---|---|
path | string | Art file (.px.js). Relative paths resolve against the workspace. |
source | string | Inline PXL source instead of a file (include() resolves against the workspace). |
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
| Parameter | Type | Description |
|---|---|---|
path | string | Art file (.px.js). Relative paths resolve against the workspace. |
source | string | Inline PXL source instead of a file (include() resolves against the workspace). |
name required | string | |
out required | string | .isbsprite | .gif | .png |
seed | integer |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
lamps | array of object | |
ambient | number 0–1 | |
ambientColor | string | |
sky | number ≥ 0 | |
skyColor | string | |
cell | integer > 0 | |
smooth | boolean | |
block | number 0–1 | |
emit | array of string | |
solid | boolean | |
normals | "dome" | "bevel" | "luma" | |
depth | number | |
lightMap | string | Also save the light map here |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
shape | "dome" | "bevel" | "luma" | |
depth | number | |
w | integer > 0 | |
on | array of string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
colors required | array of string | |
r | number > 0 | |
strength | number | |
color | string | |
bands | integer | |
ramp | integer > 0 | |
ramps | array of array of string | Ramps dark → light (ramp mode; default: auto from the image colors) |
where | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
mode | "shade" | "light" | |
steps | integer > 0 | |
density | number 0–1 | |
region | object or array of number | |
ramps | array of array of string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
sheet required | string | LPC sheet .png (created if missing) |
action required | "spellcast" | "thrust" | "walk" | "slash" | "shoot" | "hurt" | |
dir required | "up" | "left" | "down" | "right" | |
frame required | integer 0–12 | |
image required | string | frame image (or project → its first frame) |
sourceFrame | integer ≥ 0 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project/image: .isbsprite, .png (sheet with frameWidth), .gif |
out required | string | .png |
gif | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
ops required | array of object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
outDir required | string | |
frame | integer ≥ 0 | |
scale | integer 1–16 | |
nineSlice | object | |
layer | integer ≥ 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. |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
frameWidth required | integer > 0 | |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
frameWidth required | integer > 0 | |
frameHeight | integer > 0 | |
stabilize | boolean | |
anchor | "bottom-center" | "center" | "top-center" | |
unifyPalette | boolean | |
maxColors | integer | |
removeFlicker | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Generate a simple looping animation sheet from one clean sprite: idle-bob | breathe | squash | shake | float | walk-bounce.
Parameters (8) · required: path, out, type
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out required | string | |
type required | "idle-bob" | "breathe" | "squash" | "shake" | "float" | "walk-bounce" | |
frames | integer 2–32 | |
amplitude | number | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Combine separate frame images into one sprite sheet.
Parameters (3) · required: frames, out
| Parameter | Type | Description |
|---|---|---|
frames required | array of string min 1 items | |
out required | string | |
columns | integer |
Export a sprite sheet as an animated GIF.
Parameters (9) · required: path, out, frameWidth
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out required | string | |
frameWidth required | integer > 0 | |
frameHeight | integer > 0 | |
fps | number > 0 | |
scale | integer 1–16 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project/image: .isbsprite, .png (sheet with frameWidth), .gif |
action required | "idle" | "walk" | "walk6" | "run" | "attack" | "jump" | "hurt" | "death" | |
from | integer ≥ 0 | |
frames | integer 1–16 | |
tag | string | |
out | string | |
frameWidth | integer > 0 | |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project/image: .isbsprite, .png (sheet with frameWidth), .gif |
frame | integer ≥ 0 | |
view | "side" | "front" | |
stride | integer 1–8 | |
directions | map of integer | |
out | string | |
layer | integer ≥ 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. |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project/image: .isbsprite, .png (sheet with frameWidth), .gif |
frame | integer ≥ 0 | |
rules | array of map of any | |
legLine | number 0.5–0.98 | |
plume | boolean | |
out required | string | .isbsprite output |
walk | "side" | "front" | also append a walk cycle |
layer | integer ≥ 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. |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project/image: .isbsprite, .png (sheet with frameWidth), .gif |
op required | "squash" | "stretch" | "anticipation" | "impact" | "flash" | |
frame required | integer ≥ 0 | |
amount | integer 1–8 | |
color | string | |
ms | integer ≥ 10 | |
out | string | |
layer | integer ≥ 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. |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | sheet image |
minGap | integer ≥ 1 | |
pad | integer ≥ 0 | |
out required | string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project/image: .isbsprite, .png (sheet with frameWidth), .gif |
centerX | boolean | |
out | string | |
frameWidth | integer > 0 | |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project/image: .isbsprite, .png (sheet with frameWidth), .gif |
margin | integer 0–8 | |
cropUnion | string | save the union-cell cropped project here |
pad | integer ≥ 0 | |
frameWidth | integer > 0 | |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
filter required | "replaceColor" | "invert" | "brightnessContrast" | "hueSaturation" | "colorCurve" | "convolution" | "despeckle" | "outline" | "selout" | "shiftedShade" | "gradientMap" | "posterize" | |
params | map of any | |
frames | "all" or array of integer | frames to process (default all) |
layers | "all" or array of integer | layers to process (default all) |
region | object | only change pixels inside this rectangle (the filter still sees the whole cel) |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
op required | "sprite_size" | "canvas_size" | "crop" | "trim" | "trim_grid" | "rotate" | "flip" | "shift" | |
width | integer > 0 | |
height | integer > 0 | |
percent | number > 0 | |
method | "nearest" | "bilinear" | "rotsprite" | "scale2x" | "scale3x" | "epx" | |
left | integer | |
top | integer | |
right | integer | |
bottom | integer | |
region | object | |
grid | object | |
degrees | number | |
axis | "h" | "v" | |
dx | integer | |
dy | integer | |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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-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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
ops required | array of "strip_checker" | "dehalo" | "despeckle_clusters" | "dedupe" | "harden_steps" min 1 items | |
minSize | integer ≥ 1 | |
tolerance | number ≥ 0 | |
steps | array of integer | |
checkerMode | "connected" | "all" | |
frames | "all" or array of integer | frames to process (default all) |
layers | "all" or array of integer | layers to process (default all) |
region | object | only change pixels inside this rectangle (the filter still sees the whole cel) |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
minOut | integer ≥ 1 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
outDir required | string | |
stripChecker | boolean | |
exactFirst | boolean | |
scale | "auto" or number | "auto" (default) or force a pixel size |
repairGrid | map of any | use pixel_repair_grid-style options instead of the autoScale step |
hardenSteps | array of integer | |
despeckle | integer ≥ 0 | |
dedupe | number ≥ 0 | |
dehalo | boolean | |
maxColors | integer 0–256 | |
palette | string or array of string | preset name or hex list to lock to |
upscale | integer 1–32 | |
recipe | any | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out required | string | |
recipe required | string or map of any | |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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-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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
outDir required | string | |
count | integer 1–32 | |
hueShifts | array of number | |
palette | string or array of string | |
targetRamps | array of array of string | |
variants | array of array of array of string | |
keepGrays | boolean | |
frameWidth | integer > 0 | Treat a PNG as a sprite sheet with this frame width |
frameHeight | integer > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project or image: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), .png/.apng (native indexed animation), .gif/.webp (animated → frames), .jpg/.tiff/.avif |
out required | string | |
format | "png" | "png-sequence" | "gif" | "apng" | "webp" | "webp-animated" | "jpeg" | "tiff" | "avif" | "gbsprite" | "svg" | "css" | "preview" | |
scale | integer 1–64 | Integer upscale (nearest) |
area | string or object | Slice 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 |
splitLayers | boolean | Each layer separately |
splitTags | boolean | Each tag separately (direction honored) |
frames | "all" or integer or array of integer | "all" (default), a frame index or list |
tag | string | Only this tag's frames, in its playback direction |
from | integer | |
to | integer | |
direction | "tag" | "forward" | "reverse" | "pingpong" | "pingpong-reverse" | Default "tag" = each tag's own direction |
frameWidth | integer > 0 | Treat a single image as a sheet with this cell width |
frameHeight | integer > 0 | |
background | string | Hex color to composite onto (GIF/JPEG/any) |
quality | integer 1–100 | |
indexed | boolean | |
title | string | |
loop | integer 0–4294967295 | APNG play count: 0 infinite; omitted retains imported count |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Project or image: .isbsprite (legacy .gbsprite, .pforge/.aseprite/.ase imports), .png/.apng (native indexed animation), .gif/.webp (animated → frames), .jpg/.tiff/.avif |
out required | string | Sheet PNG path |
scale | integer 1–64 | Integer upscale (nearest) |
area | string or object | Slice 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 |
splitLayers | boolean | Each layer separately |
splitTags | boolean | Each tag separately (direction honored) |
frames | "all" or integer or array of integer | "all" (default), a frame index or list |
tag | string | Only this tag's frames, in its playback direction |
from | integer | |
to | integer | |
direction | "tag" | "forward" | "reverse" | "pingpong" | "pingpong-reverse" | Default "tag" = each tag's own direction |
frameWidth | integer > 0 | Treat a single image as a sheet with this cell width |
frameHeight | integer > 0 | |
data | string | |
dataFormat | "json-hash" | "json-array" | "texturepacker" | "godot" | "phaser" | "unity" | "none" | |
type | "horizontal" | "vertical" | "rows" | "columns" | "packed" | |
columns | integer ≥ 0 | |
rows | integer ≥ 0 | |
width | integer ≥ 0 | |
height | integer ≥ 0 | |
borderPadding | integer ≥ 0 | |
shapePadding | integer ≥ 0 | |
innerPadding | integer ≥ 0 | |
trim | boolean or "cel" | "sprite" | |
extrude | integer 0–8 | |
mergeDuplicates | boolean | |
ignoreEmpty | boolean | |
powerOfTwo | boolean | |
groupRows | "layer" | "tag" | "group" | |
splitSheets | boolean or "layer" | "tag" | "group" | |
filenameFormat | string | |
resPath | string | Godot texture path prefix, default res:// |
title | string |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | Sheet image |
out required | string | |
type | "rows" | "columns" | "horizontal" | "vertical" | |
x | integer ≥ 0 | |
y | integer ≥ 0 | |
w required | integer > 0 | |
h required | integer > 0 | |
padX | integer ≥ 0 | |
padY | integer ≥ 0 | |
partial | boolean | |
ignoreEmpty | boolean | |
duration | integer > 0 | |
max | integer ≥ 0 | |
tags | array of object |
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
| Parameter | Type | Description |
|---|---|---|
paths required | array of string min 1 items | |
out required | string | |
duration | integer > 0 | |
anchor | "top-left" | "center" | "bottom" |
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
| Parameter | Type | Description |
|---|---|---|
input required | string or array of string | Folder or list of files |
outDir required | string | |
recipe required | string or map of any or array of map of any | |
filename | string | Output name template, default "{title}.png" |
palette | string | Shortcut: append an "apply palette" step (preset name or palette file) |
scale | integer ≥ 1 | Export upscale |
video_* · Video to pixel art (1)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | video or animated image file |
out required | string | output: .isbsprite | .gif | .png (sheet) |
start | number ≥ 0 | seconds (default 0) |
end | number ≥ 0 | seconds (default start + 3, or the end of the clip) |
fps | number > 0, ≤ 30 | sampled frames per second (default 8) |
width | integer 8–512 | output width in pixels (default 96) |
colors | integer 2–256 | shared palette size when no palette is given (default 16) |
palette | string or array of string | preset name or hex list |
dither | "none" | "bayer2" | "bayer4" | "floyd" | |
removeBackground | boolean | |
removeFlicker | boolean | default true |
maxFrames | integer 1–600 | cap (default 120) |
texture_* · Texture fill and scatter (2)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | PNG / project to edit (created if missing when width/height given) |
out | string | |
width | integer > 0 | |
height | integer > 0 | |
frame | integer ≥ 0 | |
layer | integer ≥ 0 | |
kind required | "noise" | "noise_circle" | "voronoi" | "dither" | "gradient" | "recipe" | "pattern" | "tile_group" | |
region | object | |
colors | array of string | Hex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels |
seed | integer | |
scale | number > 0 | |
cells | integer > 0 | |
border | string | |
wrap | boolean | |
mix | number 0–1 | |
pattern | integer or string | |
type | "linear" | "radial" | |
direction | "vertical" | "horizontal" | "diagonal" | |
x0 | number | |
y0 | number | |
x1 | number | |
y1 | number | |
cx | number | |
cy | number | |
r | number | |
recipe | string | |
tile | integer > 0 | |
mortar | string | |
part | string | pattern: image path (or "path#x,y,w,h") |
parts | array of string | tile_group parts |
only | string | |
make_tileable | boolean | |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
out | string | |
width | integer > 0 | |
height | integer > 0 | |
frame | integer ≥ 0 | |
layer | integer ≥ 0 | |
region | object | |
parts required | array of string min 1 items | |
ramp | array of string | Hex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels |
count | integer > 0 | |
seed | integer | |
on | array of string | Hex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels |
clip | boolean | |
rflip | boolean or string | |
rswap | array of map of string | |
minDist | number ≥ 0 | |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
path required | string | |
tileW required | integer > 0 | |
tileH | integer > 0 | |
offsetX | integer ≥ 0 | |
offsetY | integer ≥ 0 | |
flips | boolean | |
columns | integer > 0 | |
out required | string | tileset PNG path |
map | string | .tmj path (default next to out) |
csv | string | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
tmj | string | |
map | object | |
tileset | string | |
tileW | integer > 0 | |
tileH | integer > 0 | |
out required | string | |
background | string | |
scale | integer 1–16 |
autotile_* · Autotiles (1)
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
| Parameter | Type | Description |
|---|---|---|
tile | string | |
region | object | |
recipe | string | |
ramp | array of string | Hex colors ("#rrggbb"); "transparent" erases, "keep" leaves pixels |
size | integer 4–128 | |
seed | integer | |
kind | 16 or 47 or "16" or "47" | |
palette | "tile" or "none" or array of string | |
out required | string | |
json | string |
Surfaces, materials and painting
Lighting maps, material previews and the scene painter.
surface_* · Sprite lighting surfaces and material projects (11)
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
outDir required | string min length 1 | |
options | object | |
sheet | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out required | string min length 1 | |
options | object | |
lights required | array of object max 16 items | |
ambient | number 0–2 | |
ambientColor | array of any min 3 items, max 3 items | |
toon | boolean | |
toonSteps | number 2–12 | |
parallaxDepth | number 0–0.5 | |
viewX | number 0–1 | |
viewY | number 0–1 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Describe source-defined material controls, exact units, defaults and known evidence limits. Does not execute a reference application.
No parameters.
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
outDir required | string min length 1 | |
prefix | string max length 80 | |
settings | object | |
preset | string min length 1 | |
inputs | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Read legacy or Isberg material presets; write .isbpreset documents preserving settings, lights and retained fields.
Parameters (5) · required: action, file
| Parameter | Type | Description |
|---|---|---|
action required | "read" | "write" | |
file required | string min length 1 | |
out | string min length 1 | |
settings | object | |
lights | array of object max 32 items |
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
| Parameter | Type | Description |
|---|---|---|
action required | "create" | "import" | "export" | "inspect" | "update" | "maps" | |
file required | string min length 1 | |
out | string min length 1 | |
image | string min length 1 | |
name | string max length 100 | |
processor | integer 0–127 | |
settings | object | |
inputs | object | |
outDir | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
image required | string min length 1 | |
out required | string min length 1 | |
settings | object | |
normal | string min length 1 | |
specular | string min length 1 | |
occlusion | string min length 1 | |
parallax | string min length 1 | |
preview | object | |
backend | "cpu" | "gpu" |
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
| Parameter | Type | Description |
|---|---|---|
operation required | "decode" | "encode" | "resize" | "gray" | "inspect" | |
file required | string min length 1 | |
out | string min length 1 | |
format | "RGBA8888" | "RGBA8888_Premultiplied" | "ARGB32" | "ARGB32_Premultiplied" | "RGB32" | "RGB888" | "Grayscale8" | "Alpha8" | "Indexed8" | |
width | integer 1–16384 | |
height | integer 1–16384 | |
bytesPerLine | integer 1–10000000 | |
palette | array of array of integer max 256 items | |
descriptor | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
lights required | array of object max 32 items | |
frames required | integer 0–10000000 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
operation required | "inspect" | "general" | "processor" | "add" | "duplicate" | "remove" | "move" | |
processor | integer 0–127 | |
target | integer 0–127 | |
image | string min length 1 | |
name | string max length 100 | |
metadata | map of any | |
lights | array of object max 32 items | |
settings | object | |
frames | object |
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
| Parameter | Type | Description |
|---|---|---|
session required | string min length 1 | |
operation required | "create" | "inspect" | "step" | "render" | "reset" | |
preview | object | |
project | string min length 1 | |
image | string min length 1 | |
out | string min length 1 | |
settings | object |
material_* · Material maps (2)
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
outDir required | string min length 1 | |
prefix | string max length 80 | |
options | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Render local sprite lighting using generated or supplied normal/specular/occlusion maps and up to 16 colored point lights.
Parameters (10) · required: path, out
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out required | string min length 1 | |
options | object | |
maps | object | |
lights | array of object max 16 items | |
ambient | number 0–2 | |
shininess | number 1–256 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean |
Inspect scene targets, resource sharing, masks, animation clips and snapshots. includeScene returns the authoritative source scene.
Parameters (5) · required: path
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
includeScene | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds required | array of string min 1 items, max 10000 items | |
descendants | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
action required | "set" | "add" | "subtract" | "all" | "clear" | "unmask" | "invert" | "grow" | "shrink" | |
type | "indices" | "face" | "sphere" | "box" | |
indices | array of integer max 250000 items | |
face | integer ≥ 0 | |
center | array of any min 3 items, max 3 items | |
radius | number > 0 | |
min | array of any min 3 items, max 3 items | |
max | array of any min 3 items, max 3 items | |
preview | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
center required | array of any min 3 items, max 3 items | |
radius required | number > 0 | |
opacity | number 0–1 | |
falloff | "smooth" | "linear" | "constant" | "custom" | |
curve | array of array of any min 2 items, max 32 items | |
target | "vertex" | "edge" | "face" | |
channels | array of any min 4 items, max 4 items | |
masks | map of array of integer | |
frontOnly | boolean | |
camera | array of any min 3 items, max 3 items | |
ignoreTransparent | boolean | |
alphaThreshold | number 0–1 | |
preview | object | |
channel | "color" | "normal" | |
color | string or array of number | |
normal | array of any min 3 items, max 3 items | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Fill, round, replace or seeded-randomize enabled RGBA channels across target resources, respecting saved or supplied per-node masks.
Parameters (14) · required: path, action
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
action required | "fill" | "round" | "replace" | "randomize" | |
color | string or array of number | |
target | string or array of number | |
threshold | number 0–2 | |
seed | integer | |
channels | array of any min 4 items, max 4 items | |
masks | map of array of integer | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
action required | "smooth" | "invert" | "tangents" | |
masks | map of array of integer | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
action required | "split" | "merge" | "hard" | "auto" | "invert-winding" | |
angle | number 0–180 | |
tolerance | number > 0 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
action required | "capture" | "apply" | "import" | "export" | |
snapshotFile | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
masks | map of array of integer | |
strict | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
nodeIds | array of string min 1 items, max 10000 items | |
descendants | boolean | |
preview required | object | |
includeGeometry | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
out required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
format | "scene" | "painter" | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local exported scene JSON or scene-painter document; application .isberg projects must first export their scene. |
action required | "list" | "undo" | "redo" | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
Activate one of the four bundled world/floor-plan engines.
Parameters (1) · required: editor
| Parameter | Type | Description |
|---|---|---|
editor required | "town" | "buildings" | "terrain" | "floorplan" |
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
| Parameter | Type | Description |
|---|---|---|
editor required | "town" | "buildings" | "terrain" | "floorplan" | |
value | map of any |
Run the reference world engine with its current settings, optionally updating its complete native state first.
Parameters (2) · required: editor
| Parameter | Type | Description |
|---|---|---|
editor required | "town" | "buildings" | "terrain" | "floorplan" | |
value | map of any |
level_* · Level & playtest (10)
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
| Parameter | Type | Description |
|---|---|---|
out required | string 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" | |
seed | string or number | |
difficulty | "relaxed" | "standard" | "challenging" | |
scale | number 0.75–2 | |
name | string | |
settings | object |
Read level metadata, original source warnings, object hierarchy, world transforms and conservative collider bounds.
Parameters (5) · required: path
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
id | string | |
query | string | |
type | "box" | "sphere" | "cylinder" | "plane" | "marker" | "light" | "camera" | "group" | "unresolved" | "mesh" | |
limit | integer 1–10000 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "add" | "update" | "delete" | "duplicate" | |
id | string | |
object | object | |
offset | array of any min 3 items, max 3 items |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
settings | object | |
spawn | array of any min 3 items, max 3 items | |
spawnObject | string |
Undo or redo level geometry/settings edits saved by level tools. Gameplay simulation does not add geometry-history entries.
Parameters (2) · required: path, op
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "undo" | "redo" |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
name | string |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "reset" | "state" | "step" | |
position | array of any min 3 items, max 3 items | |
input | object | |
dt | number 0.000001–0.25 | |
steps | integer 1–1200 | |
cameraMode | "first" | "third" | "topdown" |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out | string min length 1 | |
objectBudget | integer 1–10000 | |
colliderBudget | integer 1–10000 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
projectRoot required | string min length 1 | |
out required | string min length 1 | |
name | string |
3D scenes, models and meshes
Scenes, rigs, animation, tile models, vertex painting and format interchange.
scene3d_* · 3D scene & animation (33)
Inspect local brush, billboard, mirror, skeleton roots and four-slot skin editing capabilities.
Parameters (3)
| Parameter | Type | Description |
|---|---|---|
source | string min length 1 | |
node | string | |
vertex | integer ≥ 0 |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
overwrite | boolean | |
options required | object |
Add an actual UV mapped wedge or closed segmented cone mesh using the selected embedded material.
Parameters (5) · required: source, out, type
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
overwrite | boolean | |
type required | "wedge" | "cone" | |
options | map of any |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
overwrite | boolean | |
node required | string | |
billboard | map of any | |
mirror | map of any | |
directional | object |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
overwrite | boolean | |
node required | string | |
root required | string | |
automatic | boolean |
Edit bone display length/thickness without scaling transforms or changing skin deformation.
Parameters (6) · required: source, out, node
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
overwrite | boolean | |
node required | string | |
length | number 0–10000 | |
thickness | number 0.001–1000 |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
overwrite | boolean | |
node required | string | |
vertices required | array of integer min 1 items | |
slots required | array of object min 4 items, max 4 items |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
name | string | |
overwrite | boolean | |
useExtension | boolean |
Export a complete Isberg .isbtiles document retaining editable geometry, hierarchy, animation, cameras, shaders and imported source metadata.
Parameters (11) · required: source, out
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
time | number ≥ 0 | |
clipId | string | |
actId | string | |
original | boolean | |
mode | "editable" | "baked" | "original" | |
isolateRigs | boolean | |
allowLossyCore | boolean | |
includeExtension | boolean | |
overwrite | boolean |
Inspect native actors, editable exact scalar actions, UV frames, weighted acts and supported native behavior domains.
Parameters (2) · required: source
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
includeRecords | boolean |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
time required | number ≥ 0 | |
clipId | string | |
actId | string | |
cameraPosition | array of number min 3 items, max 3 items | |
cameraDirection | array of number min 3 items, max 3 items | |
includeMeshes | boolean | |
out | string min length 1 | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
easings | map of any | |
bindings | map of any | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
kind required | "action" | "uv" | "act" | "behavior" | |
id required | string | |
value required | map of any | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "inspect" | "set" | "remove" | |
constraint | object | |
id | string |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
target required | string min length 1 | |
out required | string min length 1 | |
clipId required | string | |
mapping required | map of string | |
name | string | |
fps | integer 1–120 | |
rootMotion | boolean | |
translationScale | number > 0 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
clipId required | string | |
name | string | |
fps | integer 1–120 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
node required | string | |
weights | array of number max 256 items |
Create an independent local 3D scene with geometry, hierarchy, skeletons, animation clips, lights and cameras.
Parameters (4) · required: out
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
name | string | |
scene | map of any | |
primitive | "cube" | "plane" | "sphere" | "cylinder" |
Inspect a local advanced scene: objects, shared meshes, bones, skinning, animation clips, choreography and component selection.
Parameters (1) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 |
Open a local advanced scene in the running unified desktop through its authenticated loopback bridge.
Parameters (1) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
format required | "frames" | "webm" | |
file | string min length 1 | |
clip | string | |
act | string | |
overwrite | boolean |
Inspect or finish a pending local 3D animation export job returned by scene3d_render.
Parameters (2) · required: id
| Parameter | Type | Description |
|---|---|---|
id required | string | |
finish | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "primitive" | "tile" | "add" | "edit" | "remove" | "parent" | "instance" | |
id | string | |
type | "cube" | "plane" | "sphere" | "cylinder" | "mesh" | "group" | "bone" | "camera" | "light" | |
options | map of any | |
parent | string or null | |
preserveWorld | boolean |
Select mesh vertices, edges or triangle faces. Replace/add/subtract/intersect/all/invert selections; component IDs are zero-based.
Parameters (6) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
node | string | |
mode | "vertices" | "edges" | "faces" | |
operation | "replace" | "add" | "subtract" | "intersect" | "all" | "invert" | |
indices | array of integer max 250000 items |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
node | string | |
operation required | "split" | "subdivide" | "extrude" | "delete" | "transform" | "paint" | "uv" | |
options | map of any |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "add" | "edit" | "assign" | "environment" | "activeCamera" | |
id | string | |
node | string | |
options | map of any | |
texture | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "bind" | "unbind" | "weights" | "paint" | "rest" | |
node | string | |
joints | array of string max 256 items | |
vertices | array of integer max 250000 items | |
influences | array of object max 256 items | |
options | map of any |
Edit clips, keyframe tracks, interpolation, markers and weighted choreography items. Animation quaternion values use XYZW and time is seconds.
Parameters (6) · required: file, action
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "clip" | "clipEdit" | "key" | "removeKey" | "marker" | "act" | "actItem" | |
clip | string | |
act | string | |
options | map of any |
Evaluate scene hierarchy, quaternion/Hermite animation, choreography, skin deformation and markers locally. Optionally save a sampled animation to JSON.
Parameters (9) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
clip | string | |
act | string | |
time | number ≥ 0 | |
from | number ≥ 0 | |
frames | integer 1–1000 | |
fps | number 1–240 | |
includeGeometry | boolean | |
out | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "save" | "instantiate" | |
node | string | |
prefab required | string min length 1 | |
options | map of any |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
format required | "json" | "gltf" | "glb" | "obj" | "dae" | "tmx" | |
options | map of any |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
format | "json" | "isbtiles" | "gbtiles" | "gltf" | "glb" | "obj" | "tmx" | |
resources | map of string |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out | string 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" | |
id | string | |
node | string | |
name | string | |
property | string | |
component | string | |
keys | array of object max 100000 items | |
times | array of number max 100000 items | |
delta | number -1000000000000–1000000000000 | |
index | integer ≥ 0 | |
to | integer ≥ 0 | |
tileset | integer ≥ 0 | |
frame | object | |
segment | object | |
weights | array of object max 100000 items | |
marker | object |
model_* · Tile models (.isbtiles) (3)
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
scene | map of any | |
atlasFile | string min length 1 | |
tileWidth | integer ≥ 1 | |
tileHeight | integer ≥ 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "add" | "remove" | "transform" | "duplicate" | "settings" | "vertices" | "uv" | "diagonal" | "subdivide" | "cut" | "extrude" | "selectionTransform" | "snap" | "weld" | "copy" | "paste" | "atlasAdd" | "atlasSelect" | "atlasRemove" | |
id | string | |
ids | array of string | |
tile | map of any | |
patch | map of any | |
offset | array of any min 3 items, max 3 items |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
format required | "obj" | "gltf" | "glb" | "dae" | "fbx" | "ply" | "stl" | "tmx" | "isbtiles" | "gbtiles" | |
options | map of any |
mesh_* · Vertex painter meshes (13)
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
source | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
obj | string max length 67108864 | |
name | string max length 200 |
Inspect a local mesh: topology counts, bounds, UV presence, and saved vertex selection. Optionally include the complete indexed mesh data.
Parameters (2) · required: path
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
includeMesh | boolean |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string | |
center | array of any min 3 items, max 3 items | Brush center in mesh/world coordinates; default [0,0,0]. |
radius | number > 0 | Brush radius in mesh units; default 1. |
opacity | number 0–1 | Blend weight 0–1; default 1. |
falloff | "smooth" | "linear" | "constant" | |
selection | array 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" | |
channels | array of any min 4 items, max 4 items | |
frontOnly | boolean | |
camera | array of any min 3 items, max 3 items | World-space camera position for ray-occlusion filtering. |
ignoreTransparent | boolean | |
alphaThreshold | number 0–1 | |
curve | array of array of any min 2 items, max 32 items | |
color required | string or array of number | RGB/RGBA hex or 3–4 normalized components. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string | |
action required | "smooth" | "hard" | "auto" | "invert" | "paint" | "tangents" | |
normal | array of any min 3 items, max 3 items | |
angle | number 0–180 | |
center | array of any min 3 items, max 3 items | Brush center in mesh/world coordinates; default [0,0,0]. |
radius | number > 0 | Brush radius in mesh units; default 1. |
opacity | number 0–1 | Blend weight 0–1; default 1. |
falloff | "smooth" | "linear" | "constant" | |
selection | array 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" | |
channels | array of any min 4 items, max 4 items | |
frontOnly | boolean | |
camera | array of any min 3 items, max 3 items | World-space camera position for ray-occlusion filtering. |
ignoreTransparent | boolean | |
alphaThreshold | number 0–1 | |
curve | array of array of any min 2 items, max 32 items |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string | |
action required | "set" | "add" | "subtract" | "all" | "clear" | "invert" | "grow" | "shrink" | |
type | "indices" | "face" | "box" | "sphere" | "circle" | "lasso" | |
indices | array of integer max 250000 items | |
face | integer ≥ 0 | |
center | array of any min 3 items, max 3 items | |
radius | number > 0 | |
min | array of any min 3 items, max 3 items | |
max | array of any min 3 items, max 3 items | |
polygon | array of array of any min 3 items, max 2048 items | |
points | array of array of any max 250000 items | Lasso projected XY points, one per vertex. Omit to use world XY positions. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string | |
action required | "split" | "merge" | |
tolerance | number > 0 | Merge position quantization in mesh units; default 0.00001. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
action required | "fill" | "round" | "replace" | "randomize" | |
color | string | |
target | string | |
threshold | number 0–2 | |
channels | array of any min 4 items, max 4 items | |
selection | array of integer max 250000 items | |
seed | integer |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
action required | "capture" | "apply" | "export" | "import" | |
snapshotFile | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
selection | array of integer max 250000 items | |
tolerance | number > 0 | |
normals | boolean | |
strict | boolean |
Persist named vertex masks inside the portable mesh project, load a set, list sets or remove a set.
Parameters (5) · required: path, action
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
action required | "save" | "load" | "list" | "remove" | |
name | string max length 200 | |
indices | array of integer max 250000 items |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string 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" | |
colors | array of string max 256 items | |
image | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
collectionFile | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
out | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
action required | "reimport" | "reset" | "set_source" | |
source | string min length 1 | Local mesh JSON/project or OBJ path, absolute or relative to the workspace. |
tolerance | number > 0 | |
strict | boolean |
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
| Parameter | Type | Description |
|---|---|---|
path required | string 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)
Inspect the exact local format import/export domains, diagnostics and known unsupported features. No AI models or external services are used.
No parameters.
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
format | "json" | "obj" | "gltf" | "glb" | "dae" | "fbx" | "tmx" | "ply" | "stl" | "isbtiles" | "gbtiles" | "croco" | "crocotile" | "c3dp" | |
resources | map of string | |
overwrite | boolean | |
preserveRaw | boolean | |
useSceneExtension | boolean | |
extensionPolicy | "preserve" | "error" |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
includeMetadata | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
outDir required | string min length 1 | |
name | string | |
format required | "json" | "obj" | "gltf" | "glb" | "dae" | "fbx" | "tmx" | "ply" | "stl" | "isbtiles" | "gbtiles" | |
options | object | |
overwrite | boolean |
Export the running unified 3D editor state directly to a supported local format, including embedded morph metadata.
Parameters (5) · required: outDir, format
| Parameter | Type | Description |
|---|---|---|
outDir required | string min length 1 | |
name | string | |
format required | "json" | "obj" | "gltf" | "glb" | "dae" | "fbx" | "tmx" | "ply" | "stl" | "isbtiles" | "gbtiles" | |
options | object | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
clip | string | |
time | number ≥ 0 | |
loop | boolean | |
weights | map of array of number | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
node required | string | |
index | integer ≥ 0 | |
out | string min length 1 | |
value | map of any or null | |
overwrite | boolean |
Send an imported portable scene into the running unified 3D editor through the authenticated local bridge.
Parameters (1) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 |
Parse ASCII/binary FBX records and compressed arrays in-process and inspect original object/connection metadata without executing source code.
Parameters (2) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
includeRecords | boolean |
Audio and music
Compose music, process and render audio, and design sounds.
music_* · Music & composition (10)
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "create" | "inspect" | "update" | |
preset | "arcade" | "bright" | "comedy" | "interface" | "ambient" | "orchestral" | "electronic" | "suspense" | |
name | string | |
tempo | number 20–400 | |
beats | number 0.25–10000000 | |
sampleRate | number 8000–96000 | |
master | number 0–2 | |
normalize | boolean | |
tailSeconds | number 0–10 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "add" | "update" | "delete" | "list" | |
trackId | string | |
settings | object | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
Add/replace notes or update/delete one indexed piano-roll note. Times are beats; simultaneous notes produce polyphony.
Parameters (8) · required: path, trackId, op
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
trackId required | string | |
op required | "add" | "replace" | "update" | "delete" | "list" | |
notes | array of object max 8192 items | |
index | integer 0–8191 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "import" | "delete" | "list" | |
sampleId | string | |
source | string min length 1 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
trackId required | string | |
parameter required | "gain" | "pan" | "cutoff" | "pitch" | |
op required | "set" | "clear" | "inspect" | |
points | array of object max 4096 items | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
trackId required | string | |
op required | "add" | "update" | "delete" | "list" | |
effect | object | |
index | integer 0–15 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "import" | "export" | "sequence" | "inspect" | |
midi | string min length 1 | |
sequence | integer 0–127 | |
preserveOriginal | boolean | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
op required | "inspect" | "set" | |
tempoMap | array of object max 100000 items | |
timeSignatures | array of object max 100000 items | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
trackId required | string | |
op required | "list" | "append" | "replace" | "delete" | |
events | array of object max 200000 items | |
index | integer 0–199999 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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. |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out required | string min length 1 | |
bits | "16" | "24" | |
mono | boolean | |
normalize | boolean | |
sampleRate | number 8000–96000 | |
stemsDir | string min length 1 | |
layer | integer ≥ 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. |
frame | integer ≥ 0 | For .isbsprite projects: frame index (default 0). |
select | any | Limit 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)
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
out required | string min length 1 | |
operation required | "time_stretch" | "pitch_shift" | "spectral" | "convolution" | "vocoder" | "resample" | "reverse" | |
ratio | number 0.25–4 | |
semitones | number -24–24 | |
sampleRate | number 8000–96000 | |
secondary | string min length 1 | |
spectral | object | |
vocoder | object | |
normalizeIR | boolean | |
bits | "16" | "24" |
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
| Parameter | Type | Description |
|---|---|---|
op required | "start" | "status" | "cancel" | "list" | |
id | string | |
kind | "music" | "pcm" | |
music | object | |
pcm | object |
Search bundled local procedural audio presets, ambience scenes and recording transformations. Optionally return complete scene settings.
Parameters (4)
| Parameter | Type | Description |
|---|---|---|
query | string | |
mode | "sfx" | "ambient" | "import" | |
includeScene | boolean | |
limit | integer 1–200 |
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
presetId | string | |
scene | map of any | |
duration | number 0.1–180 | |
sampleRate | integer 8000–96000 | |
bits | "16" | "24" | |
mono | boolean | |
normalize | boolean | |
loopSeconds | number 0–4 | |
sources | array of object max 12 items |
parameter_* · Parameter sound (.isbsound) (7)
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
| Parameter | Type | Description |
|---|---|---|
operation required | "create" | "inspect" | "restore" | "route" | "playback" | "render" | "start" | "status" | "cancel" | "list" | |
session | string min length 1 | |
sound | string min length 1 | |
out | string min length 1 | |
state | object | |
order | array of "tremolo" | "ring" | "wah" | "digital" | "delay" min 5 items, max 5 items | |
processedFrames | integer 0–2646000 | |
id | string |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
op required | "create" | "inspect" | "update" | |
preset | "coin" | "zap" | "boom" | "jump" | "powerup" | "fall" | "impact" | "blip" | "random" | |
seed | integer 0–999999999 | |
patch | object |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
op required | "inspect" | "set" | |
patch | object |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
op required | "import" | "export" | "decode_code" | "encode_code" | |
setup | string min length 1 | |
code | string min length 10, max length 100000 | |
out | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 |
Start/poll/cancel worker synthesis. Cancellation terminates all remaining oscillation/effect processing. Completed jobs report actual saved WAV metadata.
Parameters (4) · required: op
| Parameter | Type | Description |
|---|---|---|
op required | "start" | "status" | "cancel" | "list" | |
id | string | |
file | string min length 1 | |
out | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
operation required | "inspect" | "preset" | "randomize" | "mutate" | "reset" | |
design | "coin" | "zap" | "boom" | "jump" | "powerup" | "fall" | "impact" | "blip" | |
seed | integer 0–4294967295 | |
noiseSeed | integer 0–999999999 | |
randomState | object | |
randomValues | array of number max 100000 items | |
amount | number 0–1 | |
quantize | boolean |
sfx_* · Sound designer (2)
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
preset | "pickup" | "laser" | "explosion" | "powerup" | "hit" | "jump" | "blip" | "random" | |
seed | integer | |
options | map of any |
media_* · Audio encoding (1)
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
format required | "mp3" | "ogg" | "flac" | "wav" | |
quality | number 0–9 |
Avatars
Layered avatar rigs with speaking, blink and motion.
avatar_* · Avatar stage (.isbavatar) (17)
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
name | string | |
width | integer 16–4096 | |
height | integer 16–4096 | |
fps | number 1–240 | |
images | array of object max 256 items |
Export a complete Isberg .isbavatar rig with embedded sprites, expressions, transforms and imported metadata.
Parameters (2) · required: file, out
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
threshold | number 0.001–1 | |
timing | object | |
microphone | object | |
output | object | |
physics | object | |
blink | object | |
background | string |
Set typed local sprite transforms, pivots, image offsets, flips, opacity and Z order.
Parameters (16) · required: file, layerId
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
layerId required | string min length 1 | |
x | number -32768–32768 | |
y | number -32768–32768 | |
rotation | number -36000–36000 | |
scaleX | number 0.01–100 | |
scaleY | number 0.01–100 | |
pivotX | number 0–1 | |
pivotY | number 0–1 | |
offsetX | number -32768–32768 | |
offsetY | number -32768–32768 | |
flipX | boolean | |
flipY | boolean | |
opacity | number 0–1 | |
zIndex | integer -4096–4096 |
Set deterministic sine/spring motion or compatibility tick frequency, drag, rotation limits, stretch and animation speed.
Parameters (25) · required: file, layerId
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
layerId required | string min length 1 | |
amplitudeX | number -1000–1000 | |
amplitudeY | number -1000–1000 | |
speedX | number 0–20 | |
speedY | number 0–20 | |
speed | number 0–20 | |
phase | number | |
phaseX | number | |
phaseY | number | |
rotationAmplitude | number -180–180 | |
spring | boolean | |
stiffness | number 1–1000 | |
damping | number 0–100 | |
drag | number 0–1 | |
bounce | number 0–500 | |
nativeFrequencyX | number | |
nativeFrequencyY | number | |
nativeDrag | number 0–100 | |
nativeAnimationSpeed | number 0–10000 | |
rotationDrag | number -100–100 | |
rotationMin | number -360–360 | |
rotationMax | number -360–360 | |
stretch | number -100–100 |
Configure a sprite speaking/blink condition, independent native state gates, ten costume memberships, alpha clipping, hotkey and bounce policy.
Parameters (11) · required: file, layerId
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
layerId required | string min length 1 | |
visible | boolean | |
condition | "always" | "speaking" | "silent" | "blinking" | "eyes-open" | "speaking-blink" | "silent-blink" | |
talkState | integer 0–2 | |
blinkState | integer 0–2 | |
costumes | array of boolean min 10 items, max 10 items | |
hotkey | string max length 24 | |
clipChildren | boolean | |
ignoreBounce | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
layerId required | string min length 1 | |
action required | "duplicate" | "reparent" | "reorder" | "replace_png" | "remove" | |
parentId | string or null | |
index | integer 0–255 | |
image | string min length 1 | |
preserveWorld | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
action required | "capture" | "set" | "remove" | "activate" | "costume" | "list" | |
expressionId | string | |
name | string | |
key | string max length 24 | |
costume | integer 1–10 | |
layers | array of object max 256 items |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
bindings | array of object max 128 items |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
time | number ≥ 0 | |
frame | integer 0–100000 | |
volume | number 0–1 | |
blink | boolean | |
costume | integer 1–10 | |
expression | string |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
action required | "list" | "undo" | "redo" |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out required | string min length 1 | |
time | number ≥ 0 | |
frame | integer 0–100000 | |
volume | number 0–1 | |
blink | boolean | |
costume | integer 1–10 | |
expression | string |
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
| Parameter | Type | Description |
|---|---|---|
operation required | "configure" | "rng" | "blink" | "spectrum" | "sensitivity" | |
file | string min length 1 | |
out | string min length 1 | |
seed | string | |
randomState | object | |
count | integer 1–100000 | |
floatRange | boolean | |
blinkState | object | |
speed | number 0.01–10 | |
chance | integer 1–1000000 | |
microphone | object | |
randomAlgorithm | "legacy-lcg32" | "pcg32" | |
wav | string min length 1 | |
fftSize | 256 or 512 or 1024 or 2048 or 4096 | |
from | number 0–192000 | |
to | number 0–192000 | |
mode | "max" | "average" | |
startFrame | integer ≥ 0 | |
includeBins | boolean | |
volume | number 0–20 | |
volumeLimit | number 0–2 | |
senseLimit | number 0–1 | |
delta | number 0–1 | |
sensitivity | number -10–1 | |
speaking | boolean | |
microphoneActive | boolean |
Create a portable local avatar rig. Optional local PNG sprite layers are embedded in the saved JSON.
Parameters (6) · required: out
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
name | string | |
width | integer 16–4096 | |
height | integer 16–4096 | |
background | string | |
layers | array of map of any max 256 items |
Validate a saved local avatar rig and report hierarchy and sprite-sheet metadata.
Parameters (1) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 |
Edit a portable avatar rig with a validated top-level patch and/or layer add, update or remove operation.
Parameters (6) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
patch | map of any | |
action | "add" | "update" | "remove" | |
layerId | string | |
layer | map of any |
Evaluate local avatar speaking/blinking, sprite-sheet frames, hierarchical transforms and spring motion at specified times.
Parameters (6) · required: file
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
time | number ≥ 0 | |
dt | number 0–0.1 | |
volume | number 0–1 | |
blink | boolean | |
steps | integer 1–600 |
RPG Creator
RPG projects, characters, diagnostics, playtest and export.
rpg_* · RPG Creator (.isbrpg) (8)
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1, max length 32768 | |
op required | "create" | "inspect" | "update" | |
options | object | |
commands | array of object min 1 items, max 1000 items | |
out | string min length 1, max length 32768 | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1, max length 32768 | |
out required | string min length 1, max length 32768 | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1, max length 32768 | |
out required | string min length 1, max length 32768 | |
overwrite | boolean | |
dataOnly | boolean | |
format | "folder" | "zip" | |
encryptImages | boolean | |
encryptAudio | boolean | |
encryptionKey | string | |
excludeUnused | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1, max length 32768 | |
out required | string min length 1, max length 32768 | |
overwrite | boolean | |
excludeUnused | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1, max length 32768 | |
out required | string min length 1, max length 32768 | |
target | "windows" | "web" | "macos" | |
architecture | "arm64" | "x64" | |
excludeUnused | boolean |
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1, max length 32768 | |
recipe | map of any | |
type | "face" | "walk" | "damage" | "battler" | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1, max length 32768 |
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
| Parameter | Type | Description |
|---|---|---|
op required | "start" | "list" | "state" | "move" | "interact" | "update" | "advance" | "choose" | "input_number" | "select_item" | "shop" | "battle_start" | "battle" | "switch" | "variable" | "save" | "load" | "reset" | "stop" | |
file | string min length 1, max length 32768 | |
session | string min length 1, max length 100 | |
dx | integer -1–1 | |
dy | integer -1–1 | |
eventId | integer ≥ 1 | |
frames | integer 1–3600 | |
choice | integer ≥ -1 | Zero-based choice index; -1 requests cancel. |
action | object | |
shopAction | object | |
troopId | integer 1–9999 | |
canEscape | boolean | |
canLose | boolean | |
id | integer 0–9999 | |
value | boolean or number | |
out | string min length 1, max length 32768 | |
overwrite | boolean |
Scripting and JavaScript
Scene scripts and the V8 JavaScript runtime.
script_* · Scene scripts (8)
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)
| Parameter | Type | Description |
|---|---|---|
source | string max length 262144 | |
sourceFile | string min length 1 | |
language | "gdscript" | "javascript" | "lua" |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out | string min length 1 | |
nodeId required | string | |
source | string max length 262144 | |
sourceFile | string min length 1 | |
language | "gdscript" | "javascript" | "lua" | |
profile | "bounded" | "native" | |
enabled | boolean | |
exports | map 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 |
Remove a node script or enable/disable its execution. Resets temporary simulation state without changing source transforms.
Parameters (4) · required: path, nodeId, action
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out | string min length 1 | |
nodeId required | string | |
action required | "remove" | "enable" | "disable" |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out | string min length 1 | |
dt | number 0–0.25 | |
steps | integer 1–1200 | |
actions | map of number or boolean | |
events | array of object max 128 items | |
limits | object |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out | string min length 1 | |
action required | "call" | "signal" | "pause" | "resume" | "clear_errors" | |
nodeId | string | |
name | string | |
args | array 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 | |
limits | object |
Inspect authored script source metadata and compilation diagnostics, plus an existing simulation state. Reading alone never executes _ready.
Parameters (4) · required: path
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
nodeId | string | |
includeSource | boolean | |
includeVariables | boolean |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out | string min length 1 | |
action required | "add" | "remove" | "list" | |
key | string | |
source | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
path required | string min length 1 | |
out | string min length 1 | |
action required | "reset" | "apply" |
v8_* · JavaScript (V8) runtime and export (13)
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.
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
modules required | map of string | |
entry | string | |
scene | map of any | |
state | map of any | |
input | map of any | |
assets | map of any | |
title | string max length 150 | |
timeoutMs | number 20–30000 | |
memoryMb | number 16–512 | |
overwrite | boolean |
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)
| Parameter | Type | Description |
|---|---|---|
file | string min length 1 | |
modules | map of string | |
entry | string | |
scene | map of any | |
state | map of any | |
input | map of any | |
timeoutMs | number 20–30000 | |
memoryMb | number 16–512 |
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
| Parameter | Type | Description |
|---|---|---|
session required | string min length 1 | |
dt | number 0–60 | |
input | map of any | |
events | array of any max 10000 items |
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
| Parameter | Type | Description |
|---|---|---|
session required | string min length 1 | |
name required | string min length 1, max length 256 | |
args | array of any |
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)
| Parameter | Type | Description |
|---|---|---|
session | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
session required | string min length 1 | |
out | string min length 1 | |
value | map of any | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
session required | string min length 1 | |
out | string min length 1 | |
overwrite | boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
session required | string min length 1 | |
action required | "start" | "status" | |
name | string | |
args | array of any | |
id | string |
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
| Parameter | Type | Description |
|---|---|---|
action required | "start" | "status" | "cancel" | |
file | string min length 1 | |
id | string |
Terminate a selected local JavaScript worker and release its live closures/timers. Source files and explicit JSON saves remain local.
Parameters (1) · required: session
| Parameter | Type | Description |
|---|---|---|
session required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
outDir required | string min length 1 | |
target required | "web" | "windows" | |
title | string max length 150 | |
includeLauncher | boolean | |
width | number 320–4096 | |
height | number 240–2160 | |
assetFiles | map of string |
Shaders
Shader graphs and shader source materials.
shader_* · Shader graph and shader materials (13)
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
op required | "create" | "inspect" | "update" | |
name | string max length 200 | |
kind | "spatial" | "canvas_item" | |
unshaded | boolean | |
execution | "webgl" | "native" |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
op required | "add" | "update" | "remove" | "list" | |
id | string | |
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" | |
x | number | |
y | number | |
params | object | |
defaults | map of number or array of number | |
image | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
op required | "connect" | "disconnect" | "inspect" | |
from | string | |
to | string | |
input | string |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
sourceOut | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
out | string min length 1 | |
shape | "sphere" | "plane" | "box" | "torus" | |
resolution | 128 or 256 or 512 or 1024 |
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
name | string | |
language | "godot" | "glsl" | |
glslVersion | 1 or 3 | |
execution | "webgl" | "native" | |
includes | map of string | |
source | string max length 262144 | |
sourceFile | string min length 1 | |
vertexSource | string max length 262144 | |
fragmentSource | string max length 262144 | |
uniforms | map of number or boolean or array of number or boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
outDir | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
name required | string | |
operation required | "set" | "reset" | "texture" | "clear_texture" | |
value | number or boolean or array of number or boolean | |
texture | string min length 1 | |
flipY | boolean |
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
| Parameter | Type | Description |
|---|---|---|
scene required | string min length 1 | |
out | string min length 1 | |
operation required | "attach" | "remove" | "inspect" | |
shader | string min length 1 | |
materialId | string | |
nodeId | string |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
outDir required | string min length 1 | |
shape | "sphere" | "plane" | "box" | "torus" | |
resolution | 128 or 256 or 512 or 1024 |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
time | number 0–86400 | |
shape | "sphere" | "plane" | "box" | "torus" | |
resolution | 128 or 256 or 512 or 1024 | |
uniforms | map of number or boolean or array of number or boolean |
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
| Parameter | Type | Description |
|---|---|---|
file required | string min length 1 | |
time | number 0–86400 | |
shape | "sphere" | "plane" | "box" | "torus" | |
resolution | 128 or 256 or 512 or 1024 | |
uniforms | map of number or boolean or array of number or boolean | |
out | string 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)
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)
| Parameter | Type | Description |
|---|---|---|
source | string min length 1 | |
demo | boolean | |
visible | boolean |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "inspect" | "open" | "create" | "add" | "remove" | "select" | "save" | "scan" | "play" | "play_current" | "stop" | |
path | string min length 1 | |
file | string min length 1 | |
class | string min length 1 | |
name | string min length 1 | |
properties | map of object |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "read" | "write" | "delete" | |
path required | string min length 1 | |
text | string max length 8388608 | |
scan | boolean |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "create" | "call" | "get" | "set" | "release" | |
class | string min length 1 | |
singleton | string min length 1 | |
handle | string min length 1 | |
method | string min length 1 | |
property | string min length 1 | |
args | array of object max 100 items | |
value | object |
Inspect bundled full engine profiles, pinned version and active isolated local sessions.
No parameters.
Inspect local full-engine project configuration, asset import cache and exact web-profile diagnostics without executing code.
Parameters (1) · required: source
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 |
Create a real full-engine source project with native GDScript classes, await, pattern matching, shader, physics floor, camera and light.
Parameters (1) · required: directory
| Parameter | Type | Description |
|---|---|---|
directory required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
kind required | "level" | "scene3d" | |
input required | string min length 1 | |
out required | string min length 1 | |
run | boolean | |
visible | boolean | |
storageKey | string min length 1, max length 1000 | |
fps | integer 1–120 |
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)
| Parameter | Type | Description |
|---|---|---|
source | string min length 1 | |
demo | boolean | |
importAssets | boolean | |
visible | boolean | |
storageKey | string min length 1, max length 1000 | |
timeout | integer 1000–600000 | |
args | array of string max 100 items |
Inspect native compiler/runtime logs, pause/resume a game, reveal its isolated window or close it.
Parameters (2) · required: id, action
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "state" | "pause" | "resume" | "show" | "close" |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "inspect" | "properties" | "change" | "set" | |
path | string | |
scene | string | |
property | string | |
value | object |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
path | string | |
method required | string min length 1 | |
args | array of object max 100 items |
Press/release native engine InputMap actions locally. Use zero to release; values in (0,1] press with analog strength.
Parameters (2) · required: id, actions
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
actions required | map of number |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
frames | integer 1–600 | |
pauseAfter | boolean |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "create" | "call" | "get" | "set" | "release" | |
class | string | |
singleton | string | |
handle | string | |
method | string | |
property | string | |
args | array of object max 100 items | |
value | object |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
path required | string | |
name required | string | |
value required | object |
Capture the actual native-engine viewport as a PNG, including rendered 2D/3D scenes, native shaders and particles.
Parameters (2) · required: id, out
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
out required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
id | string min length 1 | |
source | string min length 1 | |
out required | string min length 1 | |
format required | "web" | "windows" | |
title | string max length 150 | |
width | integer 128–7680 | |
height | integer 128–4320 |
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
| Parameter | Type | Description |
|---|---|---|
action required | "write" | "inspect" | |
source required | string min length 1 | |
out | string min length 1 |
native_* · Native engine: projects, extensions, debugger and export (20)
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.
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1 | |
mode | "game" | "editor" | |
importAssets | boolean | |
debug | boolean | |
headless | boolean | |
hidden | boolean | |
storageKey | string | |
breakpoints | array of object | |
renderer | "forward_plus" | "mobile" | "gl_compatibility" | |
driver | "vulkan" | "opengl3" | "d3d12" | |
software | boolean | |
audioDriver | "WASAPI" | "Dummy" |
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
| Parameter | Type | Description |
|---|---|---|
project required | string min length 1 | |
assemblyName | string | |
references | array of string max 1024 items |
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
| Parameter | Type | Description |
|---|---|---|
project required | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
project required | string min length 1 | |
sources required | array of string min 1 items, max 1024 items | |
output | string | |
language | "c" | "cpp" | |
platform | "windows" | "linux" | "macos" | "android" | "ios" | |
architecture | "x86_64" | "arm64" | |
freestanding | boolean | |
optimization | "Debug" | "ReleaseFast" | "ReleaseSafe" | "ReleaseSmall" | |
includes | array of string | |
defines | map of string or number or boolean | |
entry | string | |
descriptor | string |
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
| Parameter | Type | Description |
|---|---|---|
project required | string 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
| Parameter | Type | Description |
|---|---|---|
project required | string min length 1 | |
platform | "windows" | "linux" | "macos" | "android" | "ios" | |
architecture | "x86_64" | "arm64" | "universal" | |
optimization | "Debug" | "ReleaseFast" | "ReleaseSafe" | "ReleaseSmall" |
Inspect the included Windows, macOS, Linux, Android and iOS export templates, matching export-engine version, platform prerequisites and project library compatibility.
Parameters (13)
| Parameter | Type | Description |
|---|---|---|
project | string min length 1 | |
debug | boolean | |
androidKeystore | string min length 1 | |
androidKeystoreUser | string | |
androidKeystorePassword | string | |
applicationId | string | |
appleTeamId | string | |
androidSdkPath | string min length 1 | |
javaSdkPath | string min length 1 | |
androidFormat | "apk" | "aab" | |
androidTargetSdk | integer 24–99 | |
androidVersionCode | integer 1–2100000000 | |
androidVersionName | string min length 1, max length 100 |
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
| Parameter | Type | Description |
|---|---|---|
project required | string min length 1 | |
title | string | |
overwrite | boolean | |
applicationId | string | |
appleTeamId | string | |
androidSdkPath | string min length 1 | |
javaSdkPath | string min length 1 | |
androidFormat | "apk" | "aab" | |
androidTargetSdk | integer 24–99 | |
androidVersionCode | integer 1–2100000000 | |
androidVersionName | string min length 1, max length 100 |
Inspect/select/edit native scene nodes, including the actual persistent editor. Native editor edits enter its undo history.
Parameters (15) · required: id, action
| Parameter | Type | Description |
|---|---|---|
id required | string 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" | |
path | string | |
property | string | |
value | object | |
method | string | |
args | array of object | |
paused | boolean | |
actionName | string | |
pressed | boolean | |
strength | number 0–1 | |
file | string | |
class | string | |
name | string | |
properties | map of 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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "create" | "load" | "call" | "get" | "set" | "release" | |
class | string | |
resource | string | |
handle | string | |
singleton | string | |
method | string | |
property | string | |
value | object | |
args | array of object |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "read" | "write" | "delete" | |
path required | string | |
text | string max length 8388608 |
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
| Parameter | Type | Description |
|---|---|---|
id required | string 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" | |
args | array of object | |
thread | number or object | |
after | integer ≥ 0 | |
limit | integer 1–5000 |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
source required | string min length 1, max length 1048576 | |
values required | array of number min 1 items, max 1048576 items | |
groups | integer 1–65535 |
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
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
frames | integer 1–600 | |
pauseAfter | boolean |
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
| Parameter | Type | Description |
|---|---|---|
source required | string min length 1, max length 262144 | |
name | string | |
shape | "sphere" | "plane" | "box" | "torus" | |
resolution | 128 or 256 or 512 or 1024 | |
uniforms | map of object | |
textures | map of object | |
includes | map of string | |
software | boolean | |
out | string min length 1 |
Load a local res:// GDExtension descriptor and report actual native initialization status/loaded libraries.
Parameters (2) · required: id, resource
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
resource required | string |
Capture the actual native Windows engine viewport to a local PNG.
Parameters (2) · required: id, out
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
out required | string min length 1 |
Inspect native engine logs/status, save editor scenes or close the owned internal runtime host.
Parameters (2) · required: id, action
| Parameter | Type | Description |
|---|---|---|
id required | string min length 1 | |
action required | "status" | "save" | "close" |
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
| Parameter | Type | Description |
|---|---|---|
project required | string min length 1 | |
out required | string min length 1 | |
title | string | |
target | "windows-native" | "windows" | "macos" | "linux" | "android" | "ios" | |
debug | boolean | |
androidKeystore | string min length 1 | |
androidKeystoreUser | string | |
androidKeystorePassword | string | |
applicationId | string | |
appleTeamId | string | |
androidSdkPath | string min length 1 | |
javaSdkPath | string min length 1 | |
androidFormat | "apk" | "aab" | |
androidTargetSdk | integer 24–99 | |
androidVersionCode | integer 1–2100000000 | |
androidVersionName | string min length 1, max length 100 | |
renderer | "forward_plus" | "mobile" | "gl_compatibility" | |
driver | "vulkan" | "opengl3" | "d3d12" | |
software | boolean | |
audioDriver | "WASAPI" | "Dummy" |
Mobile export
Android signing and App Bundles, and mobile export information.
mobile_* · Mobile export information (1)
Inspect local Android APK/AAB tools and iOS project versus IPA prerequisites without opening the desktop. No download or remote build occurs.
Parameters (9)
| Parameter | Type | Description |
|---|---|---|
project | string min length 1 | |
debug | boolean | |
androidFormat | "apk" | "aab" | |
androidKeystore | string min length 1 | |
androidKeystoreUser | string | |
androidKeystorePassword | string | |
appleTeamId | string | |
androidSdkPath | string min length 1 | |
javaSdkPath | string min length 1 |
android_* · Android signing and bundles (2)
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
| Parameter | Type | Description |
|---|---|---|
out required | string min length 1 | |
alias required | string min length 1, max length 128 | |
password required | string min length 6, max length 4096 | |
distinguishedName | string max length 2048 | |
validityDays | integer 1–36500 | |
androidSdkPath | string min length 1 | |
javaSdkPath | string min length 1 |
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
| Parameter | Type | Description |
|---|---|---|
apk required | string min length 1 | |
out required | string min length 1 | |
keystore required | string min length 1 | |
alias required | string min length 1, max length 128 | |
password required | string min length 1, max length 4096 | |
keyPassword | string min length 1, max length 4096 | |
targetSdk | integer 24–99 | |
androidSdkPath | string min length 1 | |
javaSdkPath | string 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
| Tool | Run | Purpose |
|---|---|---|
| Batch export | resources\app\cli\gamebench.js | Convert, repair, recolor and export images and sprites; build sprite sheets |
| Aseprite-compatible batch | resources\app\cli\aseprite-compat.mjs, or gamebench.js -b | Strict, ordered batch operations following the Aseprite command-line option names |
| PXL | resources\app\cli\pxl.js | Build, inspect and list PXL .px.js art files |
| License | MCP.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
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.
| Command | What it does | Prints |
|---|---|---|
MCP.cmd --license status | Validates 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 trial | Requests this computer's 14-day free trial and activates it. Asking again returns the same trial. | Status JSON |
MCP.cmd --license devices | Lists the devices that use the saved license. | JSON array of id, name, platform, created, current |
MCP.cmd --license deactivate | Deactivates 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
| Field | Meaning |
|---|---|
licensed | true when tools and the desktop can run. |
code, message | State code (table below) and its explanation. |
key | The key, masked except for its last six characters. |
licenseId, machineId, device | License and device identifiers, and this computer's name. |
maxDevices | Devices allowed at a time (1). |
validatedAt | Time of the last successful online validation. |
graceEndsAt, daysLeft | When the license stops working without another online validation, and the days remaining. |
graceDays | Offline grace length (14). |
revalidateDue, warning | An online check is due; the grace period is close to running out. |
trial, trialEndsAt, trialDaysLeft, trialWarning | Whether this is a trial, when it ends, days left, and whether it ends soon. |
trialAvailable, trialDays, canBuy | Whether this build offers trials, the trial length, and whether a store page is configured. |
lastError, nextAttemptAt | Present when an online check failed: the error and when an automatic retry is allowed. |
State and error codes
| Code | Meaning |
|---|---|
VALID | License active on this device. |
NOT_ACTIVATED | No license key is saved on this device. |
KEY_INVALID | The key was not found. |
DEVICE_LIMIT | The license is active on another device; deactivate that device first. |
DEACTIVATED | This device was deactivated; activate it again. |
SUSPENDED, BANNED, EXPIRED, INVALID | The license cannot be used; contact Isberg Labs support. |
OFFLINE_TOO_LONG | Not validated online for more than 14 days; connect and retry. |
CLOCK | The system clock is earlier than the last check; correct it and retry online. |
DEVICE_MISMATCH | The saved activation belongs to another computer. |
TAMPERED | The saved activation is damaged or was modified. |
NETWORK, SERVICE, SIGNATURE | The license server could not be reached, rejected the request, or sent a response that could not be verified. |
BUSY | Another Isberg Labs process is contacting the license server. |
TRIAL_ENDED, TRIAL_USED, TRIAL_LOCKED | The trial is over, this computer already used its trial, or the trial key belongs to another computer. |
TRIAL_UNAVAILABLE, TRIALS_PAUSED, TRIALS_BUSY, RATE_LIMITED | Trials 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
| Option | Effect |
|---|---|
--sequence | Join 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. |
--info | Print size, frame, layer, tag and slice counts and color mode as JSON. |
--list-layers, --list-tags, --list-slices | Print layer names; tags with frame range and direction; slices with bounds. |
--help, -h | Print the option list. |
--quiet | Do not print a wrote <file> line per output. |
Processing
Applied in this order; processing flattens layers.
| Option | Effect |
|---|---|
--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-grid | Repair upscaled pixel art: detect the grid, resample, clean up. |
--pixelize <width> | Pixelize to this width (uses --max-colors, default 16, and --dither). |
--remove-bg | Remove 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
| Option | Effect |
|---|---|
--layer <name> | Only this layer; repeat for several. |
--all-layers | Include 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-tags | Export each layer or tag separately. |
--scale <n> | Integer nearest-neighbor upscale. |
Output
| Option | Effect |
|---|---|
--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. |
--rgba | Write RGBA PNG. By default PNGs are indexed when they have 256 colors or fewer. |
--trim-sprite | Crop --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
| Option | Effect |
|---|---|
--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. |
--trim | Trim each cel and record source offsets. |
--extrude [n] | Repeat edge pixels n pixels outward (default 1). |
--merge-duplicates, --ignore-empty, --power-of-two | Share identical cells, skip empty frames, round the sheet up to powers of two. |
--split-sheets | One sheet per layer or tag group. |
--group-rows | Start 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,.asepriteand.pforgefiles can be read but not written.
| Group | Options |
|---|---|
| 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.
| Command | Effect |
|---|---|
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 --help | Prints usage. |
| Option (build) | Effect |
|---|---|
--out DIR | Output folder (default: an out folder next to the art file). |
--only a,b | Build only these assets. |
--scale N | Upscale factor for the preview images (chosen automatically when omitted). |
--no-preview | Skip 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_NODEis not set to1in 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) orset 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,.isbtilesand 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.
| Format | Extensions | Import | Export | Notes |
|---|---|---|---|---|
| PNG | .png | Yes | Yes | All 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 | .png | Yes | Yes | An 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) | .png | Yes | Yes | Opened 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 | .exr | Yes | Yes | Import: 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, .png | Yes | Yes | All 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 | .gif | Yes (animated) | Yes | Animated GIF. Colors are reduced to a 256-color palette when needed; an optional background color flattens transparency. |
| WebP | .webp | Yes (animated) | Yes | WebP (still) or Animated WebP, with quality or lossless options. |
| JPEG | .jpg, .jpeg | Yes | Yes | Transparency is flattened onto a background (white by default). |
| TIFF | .tif, .tiff | Yes | Yes | Still image export. |
| AVIF | .avif | Yes | Yes | Still image export. |
| BMP | .bmp | Yes | — | |
| SVG | .svg | — | Yes | Pixel art as vector rectangles (SVG / CSS). |
| CSS box-shadow | .css + .html | — | Yes | CSS box-shadow (+ HTML); animations become CSS keyframes. |
| Image sequence | image files or a folder | Yes | Yes | Import Image Sequence (files)… / (folder)… (sorted naturally); export as PNG sequence. |
| Layer or reference image | any supported image | Yes | — | Import as New Layer…, Import as Reference Layer…. |
| Normal map | _n.png | — | Yes | File menu Export normal map (_n.png)…. |
| Slices | PNG + slices.json | — | Yes | Export slices… writes every slice as a PNG with a JSON index. |
Images in other editors
| Editor | Import | Export |
|---|---|---|
| Studio asset shelf | PNG, APNG, JPEG, WebP, GIF, BMP, TIFF, AVIF (+) | — (assets are embedded in the project) |
| Textures & terrain | Images through Open images, + Import textures, Import images, Open sprite sheet and Import heightmap | PNG (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 lighting | Source 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 stage | PNG layers (Add PNG, Resolve sprite PNGs) | Snapshot PNG (transparent background available) |
| RPG Creator | PNG character components; images in Import resources | Character sheets as Export SVG and Export PNG |
| 3D scene & animation, Tile modeler, Vertex painter, Shader graph, Shader materials, Game runtime | PNG 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 option | Output |
|---|---|
| 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 file | The 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
| Format | Extensions | Import | Export | Notes |
|---|---|---|---|---|
| GIMP palette | .gpl | Yes | Yes | Keeps color names. |
| Lospec / plain hex list | .hex, .txt | Yes | Yes (.hex) | |
| JASC palette | .pal | Yes | Yes | |
| Adobe Color Table | .act | Yes | Yes | |
| Palette from an image | .png, .gif, .jpg, .jpeg, .webp, .bmp | Yes | Yes (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
| Format | Extensions | Import | Export | Editor and notes |
|---|---|---|---|---|
| Tiled TMX map / TSX tileset | .tmx, .tsx | Yes | Yes (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 | .tmj | Yes | Yes | Pixel & animation tileset panel: Import .tmj… (with its tileset image) and Export .tmj… (map plus tileset PNG). |
| Tile map CSV | .csv | — | Yes | Pixel & animation CSV… (tile IDs, −1 for empty). |
| Tileset and map images | .png | Yes | Yes | Pixel & animation Import PNG…, Export PNG…, Map PNG…, and Open level image… (split an image into unique tiles and a map). |
| Isberg tile clipboard | .isbtileclip | Yes | Yes | MCP pixel_tile_copy and pixel_tile_paste: tile IDs, flips, empty cells, images and metadata. |
| Isberg tile project | .isbtiles | Yes | Yes | Tile modeler (Open, Save), Formats & interchange (Isberg tiles (.isbtiles)), 3D scene & animation (import). |
| Crocotile project | .croco, .crocotile, .c3dp | Yes | — | Formats & interchange; import only, save the result as .isbtiles. |
| RPG tile sheets | .png | Yes | — | RPG Creator resource folders (img/tilesets and others). |
Textures, terrain and world maps
| Editor | Import | Export |
|---|---|---|
| Textures & terrain | Images; 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 builder | Open 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 lighting | Source 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
| Editor | Import | Export |
|---|---|---|
| Audio workshop | Import 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 designer | Load settings (.json) | Export WAV (16-bit mono, named after preset and seed); Save settings (sound-settings.json); game delivery and event-bank ZIPs |
| Parameter sound | Open 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 & composition | Import sample / IR (audio files); Open composition (.music.json); Import MIDI | Export 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 stage | WAV (Measure local PCM WAV, analysis only) | — |
| RPG Creator | Audio files in Import resources (audio/bgm, bgs, me, se) | Embedded in exported games |
| Textures & terrain | Soundtrack for animations | Soundtrack 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
| Format | Extensions | Import | Export | Notes |
|---|---|---|---|---|
| Standard MIDI File | .mid, .midi | Yes | Yes | Music & 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.
| Format | Extensions | Import | Export | Notes |
|---|---|---|---|---|
| glTF / GLB | .gltf, .glb, .bin | Yes | Yes | Geometry, 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 | .fbx | Yes | Yes | ASCII 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 | .dae | Yes | Yes | Geometry, materials, hierarchy, skin controllers and animations; export includes skeletal controllers and sampled animation. |
| OBJ + MTL | .obj, .mtl | Yes | Yes | Geometry, normals, UVs, vertex colors, materials and texture sidecars. Export is a static snapshot. |
| PLY | .ply | Yes | Yes | ASCII and binary little/big endian meshes and point clouds with normals, colors and UVs (PLY/STL binary, PLY big endian). |
| STL | .stl | Yes | Yes | ASCII and binary. |
| Scene JSON | .json | Yes | Yes | The complete Isberg scene with retained source metadata (Save scene JSON). The safest format for keeping everything. |
| TMX / TSX, Isberg tiles, Crocotile | see Tiles | Yes | TMX, .isbtiles | |
| Textures | .png, .jpg, .jpeg | Yes | Yes (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.
Other 3D editors
| Editor | Import | Export |
|---|---|---|
| 3D scene & animation | Import: scene JSON, .isbtiles/.gbtiles, OBJ + MTL, glTF, GLB (with .bin, PNG and JPEG sidecars), TMX; Instantiate prefab and Open source scene (retargeting) read JSON | Save (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 modeler | Open (.isbtiles, .gbtiles, .json); Import image (atlas) | Save (model.isbtiles); glTF; OBJ; PNG |
| Vertex painter | Open 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 & playtest | Open (.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
| Editor | Import | Export |
|---|---|---|
| Shader graph | Open graph (.json); Choose local texture (PNG, JPEG, WebP) | Save graph (.shader-graph.json); Export shader (.gdshader) |
| Shader materials | Open material/source (.json, .gdshader); Add local include (.gdshaderinc, .inc, .glsl); textures (PNG, JPEG, WebP) | Save material (.shader.json); Export PNG (preview) |
| Script workspace | Open source (.gd, .js, .mjs, .lua, .txt) | Save source (scene-script.gd, .lua or .js, by language) |
| JavaScript | Load project (.json); Add local assets (any files) | Save source project (javascript-project.json); Save complete session (javascript-session.json); Export playable game |
| Pixel & animation | PXL 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 Creator | Plugin sources in an imported project | Plugin sources in project ZIPs and games |
Game-engine and reference-tool formats
| Format | Extensions | Import | Export | Where |
|---|---|---|---|---|
| Godot project | folder, project.godot, ZIP, .pck | Yes | Yes (project files) | Game runtime opens and edits projects and writes their scenes and resources (Save files). See Game runtime. |
| Godot text scene | .tscn | Yes | Yes | Import in Level & playtest; written inside native projects and the Textures & terrain Godot bundle. |
| Godot SpriteFrames | .tres | — | Yes | Pixel & animation sprite sheets. |
| Godot shader | .gdshader, .gdshaderinc | Yes | Yes (.gdshader) | Shader materials (open), Shader graph (export), Textures & terrain bundle. |
| Engine PCK pack | .pck, embedded in executables | Yes | — | Game runtime; MCP archive_extract_pck. |
| Aseprite | .ase, .aseprite | Yes | — | Pixel & animation; import only. Aseprite-style JSON sheet data is exported. |
| Earlier sprite documents | .pforge, .gbsprite | Yes | — | Pixel & animation; saved as .isbsprite. |
| TexturePacker, Phaser 3, Unity sheet data | .json | — | Yes | Pixel & animation sprite sheets. |
| Tiled | .tmx, .tsx, .tmj | Yes | Yes | See Tiles and tile maps. |
| Laigter | .laigter, .preset, .presets | Yes | — | Sprite lighting; import only. |
| Crocotile 3D | .croco, .crocotile, .c3dp | Yes | — | Formats & interchange; import only. |
| PNGTuber Plus save | .save | Yes | — | 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 | .cpt | Yes | — | Parameter sound; import only. |
| Compatible RPG project folder | folder with data, resource folders and optional js/plugins.js | Yes | Yes (ZIP) | RPG Creator Import RPG project and Export project ZIP. See RPG Creator. |
| PlayStation TIM | .TIM | — | Yes | Textures & terrain Save .TIM (PS1 binary) and Download TIM batch ZIP. |
| Blender import script | .py | — | Yes | Inside 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.
| Editor | Targets |
|---|---|
| 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 |
| JavaScript | Portable Windows game, Web game (optional Web portable launcher) |
| RPG Creator | Export playable HTML (single .html), Export Windows game, Export macOS game (Apple silicon or Intel ZIP), Export web folder |
| 3D scene & animation, Level & playtest | Through ▶ Play into Game runtime, then its exports |
Video and frame captures
| Format | Import | Export | Where 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 | — | Yes | 3D scene & animation and Avatar stage Record WebM; Textures & terrain Export WebM video. |
| MP4 with audio | — | Yes | Textures & terrain Export MP4 + audio (bundled local encoder). |
| Animated GIF | Yes | Yes | Pixel & animation; Textures & terrain Export animated GIF. |
| PNG frame sequence | Yes | Yes | 3D scene & animation Frames ZIP (PNG frames plus animation.json); Textures & terrain Export PNG sequence + timing ZIP; Pixel & animation PNG sequence. |
Isberg documents
| Document | Extension (earlier names) | Import | Export | Where |
|---|---|---|---|---|
| Workspace project | .isberg (.gbench, .veldryne) | Yes | Yes | Header Open project / Save project. |
| Sprite | .isbsprite (.gbsprite, .pforge) | Yes | Yes | Pixel & animation; keeps layers, frames, linked cels, palettes, tags, slices, groups, tile data and precision samples. |
| Tile project | .isbtiles (.gbtiles) | Yes | Yes | Tile modeler, Formats & interchange, 3D scene (import). |
| RPG project | .isbrpg (.gbrpg) | Yes | Yes | RPG Creator Open, Save, Save RPG project. |
| Lighting project / preset | .isbmaterial, .isbpreset (.gbmaterial, .gbpreset) | Yes | Yes | Sprite lighting. |
| Parameter sound | .isbsound (.gbsound) | Yes | Yes | Parameter sound. |
| Avatar rig | .isbavatar (.gbavatar) | Yes | Yes | Avatar stage Open rig, Save rig / Export .isbavatar. |
| Tile clipboard | .isbtileclip (.gbtileclip) | Yes | Yes | MCP only. |
| Project bundle | .isbundle (.gbundle) | Yes | Yes | MCP only; see Bundles. |
| Scene painter document | .isbscene (.gbscene) | Yes | Yes | MCP 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.json | Yes | Yes | The editors named in this chapter. |
Archives
| Archive | Import | Export | Where and notes |
|---|---|---|---|
.isberg project container | Yes | Yes | See What an .isberg file contains. |
.isbundle | Yes | Yes | MCP project_pack / project_unpack. |
| ZIP / ZIP64 | Yes | — | 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. |
| PCK | Yes | — | Game runtime and MCP archive_extract_pck. |
| RPG project ZIP | — | Yes | RPG Creator Export project ZIP (data, maps, resources, plugins, optional unused-resource filtering). |
| Audio ZIPs | — | Yes | game-audio-delivery.zip, style-sound-bank.zip, game-music-stems.zip. |
| 3D frame ZIP | — | Yes | 3D scene & animation Frames ZIP (scene-animation-frames.zip). |
| Texture and terrain ZIPs | — | Yes | Textures & 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 | — | Yes | Game runtime and RPG Creator macOS exports. Extract and sign on a Mac. |
MCP tools
io_export: export a sprite or image by output extension or format (PNG, PNG sequence, APNG, GIF, WebP, JPEG, TIFF, AVIF, SVG and others).io_import_sheet/io_import_sequence: import a sprite sheet or an image sequence.pixel_precision_export: export a 16-bit or float frame as PNG16 or OpenEXR.tilemap_render: render a Tiled.tmjmap to PNG.interchange_export/interchange_export_live: export a scene to glTF/GLB, Collada, TMX, PLY/STL, OBJ + MTL, JSON, FBX or.isbtiles.rpg_export_project,rpg_export_html,rpg_export_game: RPG project and game exports.native_export: native game export for the five platforms.archive_inspect: inspect ZIP or PCK metadata.
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
PATHemptied, 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_adapterslists. 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,.asepriteand.pforgefiles 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.
cHRMdata 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.apiVersionas0. Complete reference API parity is not claimed;pixel_lua_capabilitieslists 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
askPointand cancel; custom file-format callbacks; the remaining commands; non-script extension contributions; indexeddrawImage, 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_snapshotsaves 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_compileandshader_previewdo 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_rendermust 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.
| Target | Output | Requirements | Verified |
|---|---|---|---|
| Windows | x86_64 executable and game data | None for the baseline GDScript, GDExtension and Lua project | Exported games launched and saved |
| Linux | x86_64 executable and game data | Linux x86_64 with glibc 2.34 or later | Artifact only; not run on Linux |
| macOS | Universal Intel and Apple Silicon app in a ZIP, ad-hoc signed | macOS 15.0 or later; Developer ID signing and notarization for trusted distribution | Artifact only; not run on a Mac |
| Android | ARM64 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 / iPadOS | Complete Xcode project with static Lua and C libraries | Apple 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 |
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
.exedirectly from a ZIP, but then the files next to it are missing. Extract the whole ZIP first and runIsberg Labs.exefrom 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
Datafolder next to the executable. Do not run it fromC:\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.isbergfirst and open the copy with Open project. - Old files. Files with the earlier names (
.gbench,.gbsprite,.gbrpgand 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
.isbergfile.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.jsonare absolute. StartIsberg Labs.exeonce after extracting or moving the folder so it writes the real paths, then copy the entry into your client again (or updatecommand,argsandGAMEBENCH_WORKSPACEthere yourself). - Keep
ELECTRON_RUN_AS_NODEset to1in the server's environment; without it,Isberg Labs.exestarts the desktop app instead of the server. - A configuration that still names
Gamebench Studio.exemust be changed toIsberg Labs.exe. The server idgamebenchis unchanged. - Run
MCP.cmd --license statusin 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:
- Save your work and close Isberg Labs.
- Rename
DatatoData-old. - Start Isberg Labs. A new
Datafolder is created. Activate your key again; on the same PC this reuses the PC's existing slot. - Copy anything you want back from
Data-old(for examplescripts,palettesorstyles), 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.
.gbenchand 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 --licensecommands:activate <key>,status,devices,deactivate [deviceId]andtrial. 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.exeandStart Isberg Labs.cmd;MCP.cmdandmcp-config.jsonpoint 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.isbundleand 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 thegamebenchMCP 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(targetwindows, and the web export's offline launcher) andruntime_export(formatwindows) 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,.oggand 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_infonow inspects.glb,.gltf,.fbx,.dae,.obj,.ply,.stland.tmxfiles directly. The other scene tools now say that a raw model must be imported withinterchange_importfirst. - 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
DataandProjectsfolders 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_createandandroid_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
.gbrpgdocuments.
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
.gbrpgdocuments. - 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_playtestrun attached scripts. The Script workspace adds source analysis, stepping, input, timers and signals. - Projects save as
.gbenchwith 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
| Type | Lifetime. You pay once; the license has no expiry date and no subscription. |
|---|---|
| Price | CA$50 (about US$36), one-time. Stripe shows the final amount before you pay. |
| Devices | One device at a time. To use it on a different PC, deactivate the old one and activate the new one. |
| Validation | Online. The studio checks the license at activation and then about once every 24 hours. |
| Offline use | Up to 14 days after the last successful online check. Warnings start when 4 days remain. |
| Covers | Every 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. |
| Updates | Buy once and keep every update in this release line. |
| Support | [email protected] |
| Free trial | 14 days, every feature, no key needed, one trial per computer. |
| Your work | Projects, 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.
- Start
Isberg Labs.exe. The license window opens. - 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.
- 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
Datafolder 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
- Choose Buy a license in the license window, or choose Buy a license in the Download section of isberglabs.com.
- Pay on the Stripe checkout page. To buy several licenses at once, set the quantity; you get one key per license.
- 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.
- 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
- Start Isberg Labs. The license window opens on first start; later, choose ⚿ License at the bottom of the sidebar.
- Paste your key into License key (under Activate this device, or Upgrade to a license during a trial).
- Choose Activate. The status changes to Active on this device and the window shows This device is activated.
- 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 line | Lamp | Meaning |
|---|---|---|
| Checking license… | — | The saved license is being read or checked. |
| Active on this device | Green | Licensed and recently validated. |
| Active — validate online within N day(s) | Amber | Licensed, but the offline grace is running out. Connect and choose Validate now. |
| Free trial — N days left | Green, amber in the last 3 days | A trial is active. |
| Not activated | Amber | No trial or license on this device yet. |
| Free trial ended | Red | The trial is over. Enter a license key. |
| License required | Red | Any 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
| Button | What it does |
|---|---|
| Open Isberg Labs | Opens the workspace (shown when licensed or in a trial). |
| Validate now | Checks the license online immediately, skipping any retry wait. |
| Deactivate this device | Frees 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 online | Shown when a saved license could not be confirmed. Tries the server again immediately. |
| Activate | Activates the key typed in License key on this device. |
| Start 14-day free trial | Starts the trial (No key needed · every feature · one trial per computer). Hidden once this computer has used its trial. |
| Buy a license | Opens 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
- On the old PC, open License and choose Deactivate this device, then confirm.
- On the new PC, start Isberg Labs, paste the key and choose Activate.
If the old PC is gone, broken or reinstalled
- On the new PC (or the reinstalled Windows), paste the key and choose Activate.
- 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.
- Choose Deactivate next to the old device and confirm. The window says the device was deactivated and one slot is free.
- 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.
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.).
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:
| Command | What it does |
|---|---|
MCP.cmd --license status | Checks 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 trial | Starts this computer's 14-day free trial. |
MCP.cmd --license devices | Lists the devices using the saved key: id, name, platform, activation date and whether it is this device. |
MCP.cmd --license deactivate | Deactivates 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].
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.
| Code | Message | What to do |
|---|---|---|
NOT_ACTIVATED | Enter your license key to activate Isberg Labs on this device. | Activate a key or start the trial. |
KEY_INVALID | This 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_LIMIT | This 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. |
DEACTIVATED | This 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_LONG | The license has not been validated online for more than 14 days. Connect to the internet and retry. | Connect, then Retry online. |
CLOCK | The 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_MISMATCH | The saved license belongs to another device. Activate this device with your license key. | The Data folder came from another PC. Activate on this PC. |
TAMPERED | The saved license data is damaged or was modified. Retry online or activate again. | Retry online, or activate the key again. |
NETWORK | Could 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. |
SERVICE | The 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. |
SIGNATURE | The 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. |
SUSPENDED | This license is suspended. Contact Isberg Labs support. | Email [email protected]. |
BANNED | This license is blocked. Contact Isberg Labs support. | Email [email protected]. |
EXPIRED | This license has expired. Contact Isberg Labs support. | Lifetime licenses do not expire; email [email protected]. |
INVALID | This license is not valid for Isberg Labs. | The key belongs to another product or policy. Check you pasted the right key. |
TRIAL_ENDED | Your 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_USED | This computer has already used its free trial. Enter a license key to keep using Isberg Labs. | Buy and activate a license. |
TRIAL_LOCKED | This 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_PAUSED | Free trials are paused right now. Try again later. | Try again later, or buy a license. |
TRIALS_BUSY | Too many trials are being started right now. Try again later. | Try again in a few minutes. |
RATE_LIMITED | Too many trial requests from this network. Try again later. | Try again later or from another network. |
TRIAL_UNAVAILABLE | Free trials are not available in this build. | Activate a license key. |
NOT_CONFIGURED | This 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_DIRmoves 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.LICENSEandLICENSES.chromium.htmlin 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\andresources\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
| Component | Used for | License |
|---|---|---|
| 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 games | MIT; 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 exports | MIT, with the engine's third-party copyright inventory and authors list |
| Embedding wrapper for the native engine | Running the engine in-process | MIT (Moritz Voss & Contributors) |
| .NET 10.0.12 runtime and Roslyn | Local C# compilation and the integrated .NET runtime export | MIT, with .NET third-party notices |
| Zig 0.15.2 (LLVM, compiler runtime) | Local C and C++ compilation for GDExtension | MIT, with retained LLVM and library notices |
| SwiftShader | Software Vulkan fallback | Apache 2.0 and bundled notices |
| Lua 5.4 via Wasmoon 1.16.0 | Lua scripting in the editors | MIT (Wasmoon and Lua) |
| Lua GDExtension 0.7.0 (Lua 5.4.7, godot-cpp, sol2, tree-sitter) | Lua scene scripts in playtests and exported games | MIT, with the extension's third-party notices |
| Eclipse Temurin JDK 17.0.20.1+1 | Android export (build and signing) | GPLv2 with Classpath Exception, and bundled component licenses |
| Android SDK Build-Tools 35.0.1 and Platform-Tools 37.0.1 | Android export | Android SDK terms and component notices (retained) |
| bundletool 1.18.3 | Android App Bundles and APK sets | Apache 2.0 |
| sharp 0.35.5 and libvips (with libpng, libwebp, mozjpeg, libtiff, libheif, aom, lcms and others) | Image decoding, encoding and conversion | Apache 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 formats | MIT and BSD |
| draco3d 1.5.9 | Draco mesh decompression | Apache 2.0 |
| fzstd | Zstandard decompression (TMX chunks) | MIT |
| es-module-lexer | Module parsing for JavaScript game exports | MIT |
| Three.js r128 | 3D views in the World builder | MIT |
| PixiJS Legacy 5.3.12 | RPG Creator player rendering | MIT |
| EffekseerForWebGL 1.80.8 and sample effects | RPG Creator particle effects | MIT |
| Model Context Protocol SDK 1.32.2 and zod | The MCP server | MIT |
| Ported PXL modules (claude-pxl) | The pixel-art engine and its .px.js examples | MIT, Copyright (c) 2026 crsolver |
| perfectPixel ideas | Grid recovery in pixel repair | MIT attribution |
| Nine RPG plugin examples by Triacontane | Optional 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.
