### Install GB Studio from Source
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Steps to clone the repository, install dependencies, and start the GB Studio application.
```bash
cd gb-studio
corepack enable
yarn
npm run fetch-deps
npm start
```
--------------------------------
### Install Project Dependencies
Source: https://github.com/chrismaltby/gb-studio/blob/develop/CONTRIBUTING.md
Install the necessary project dependencies using Yarn. This command should be run after cloning the repository.
```bash
yarn
```
--------------------------------
### Get GB Studio CLI Version
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Check the installed version of the GB Studio CLI.
```bash
$(yarn bin gb-studio-cli) -V
```
--------------------------------
### Run BGB Emulator with Watch Flag
Source: https://github.com/chrismaltby/gb-studio/blob/develop/DEVELOPERS.md
Start the BGB emulator from the command line with the -watch flag to automatically reload your game on each successful build. This is useful for rapid iteration during development.
```bash
./bgb -watch -rom game.gb
```
--------------------------------
### BGB Profiling Output Example
Source: https://github.com/chrismaltby/gb-studio/blob/develop/DEVELOPERS.md
Example of profiling data generated by BGB when profiling is enabled in GB Studio. This data can be processed by tools like `bgb_profiling_toolkit` or custom scripts.
```text
_UIOnInteract:_PopBank:_StackPop MIN: 34 AVG: 34.00 95P: 34 MAX: 34 TOTAL: 0x0000000000000044 NCALLS: 2
_ActorRunCollisionScripts:_PushBank:_StackPush MIN: 26 AVG: 26.00 95P: 26 MAX: 26 TOTAL: 0x0000000000000034 NCALLS: 2
_UIUpdate:_UIUpdate_b:_UIDrawTextBuffer MIN: 290 AVG: 354.00 95P: 290 MAX: 419 TOTAL: 0x00000000000002c5 NCALLS: 2
_UpdateCamera:_PushBank:_StackPush:_MusicUpdate MIN: 84 AVG: 84.00 95P: 84 MAX: 84 TOTAL: 0x0000000000000054 NCALLS: 1
_FadeUpdate:_PushBank MIN: 82 AVG: 82.00 95P: 82 MAX: 82 TOTAL: 0x00000000000000a4 NCALLS: 2
```
--------------------------------
### Manage Project Plugins
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Handles adding and removing plugins from a project, supporting both project-scoped and global installations. It also allows adding custom plugin repositories and listing available plugins.
```typescript
import {
addPluginToProject,
removePluginFromProject,
getGlobalPluginsList,
addUserRepo,
} from "lib/pluginManager/repo";
// Add a custom plugin repository
await addUserRepo("https://example.com/my-gbs-plugins/plugins.json");
// List all available plugins across all registered repos
const repos = await getGlobalPluginsList();
for (const repo of repos) {
console.log(`[${repo.name}]`);
repo.plugins.forEach((p) => console.log(` ${p.id} - ${p.name}`));
}
// Install a specific plugin into the current project
const installedPath = await addPluginToProject(
"/path/to/MyGame.gbsproj",
"some-plugin-id", // plugin id from the repository manifest
"core", // repo id: "core" = official GB Studio repo
);
console.log("Plugin installed at:", installedPath);
// => /path/to/MyGame/plugins/some-plugin-id/
// Remove a plugin from the project
await removePluginFromProject("/path/to/MyGame.gbsproj", "some-plugin-id");
```
--------------------------------
### addPluginToProject / removePluginFromProject
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Downloads and installs a plugin from a repository into the current project's `plugins/` folder or the global plugins directory. Plugins can contribute new script events, engine C files, scene types, and assets. It also supports removing installed plugins.
```APIDOC
## `addPluginToProject / removePluginFromProject` — Plugin Management
Downloads and installs a plugin from a repository into either the current project's `plugins/` folder (project-scoped) or the global plugins directory (engine/global plugins). Plugins can contribute new script events, engine C files, scene types, and assets.
```typescript
import {
addPluginToProject,
removePluginFromProject,
getGlobalPluginsList,
addUserRepo,
} from "lib/pluginManager/repo";
// Add a custom plugin repository
await addUserRepo("https://example.com/my-gbs-plugins/plugins.json");
// List all available plugins across all registered repos
const repos = await getGlobalPluginsList();
for (const repo of repos) {
console.log(`[${repo.name}]`);
repo.plugins.forEach((p) => console.log(` ${p.id} - ${p.name}`));
}
// Install a specific plugin into the current project
const installedPath = await addPluginToProject(
"/path/to/MyGame.gbsproj",
"some-plugin-id", // plugin id from the repository manifest
"core", // repo id: "core" = official GB Studio repo
);
console.log("Plugin installed at:", installedPath);
// => /path/to/MyGame/plugins/some-plugin-id/
// Remove a plugin from the project
await removePluginFromProject("/path/to/MyGame.gbsproj", "some-plugin-id");
```
```
--------------------------------
### CLI: Make Web Build
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Generate a web-playable build from a GB Studio project.
```bash
$(yarn bin gb-studio-cli) make:web path/to/project.gbsproj out/
```
--------------------------------
### CLI: Make Pocket Build
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Create a build for the Analogue Pocket from a GB Studio project.
```bash
$(yarn bin gb-studio-cli) make:pocket path/to/project.gbsproj out/game.pocket
```
--------------------------------
### Wrapper Component Example
Source: https://github.com/chrismaltby/gb-studio/blob/develop/src/stories/Index.mdx
Example of a wrapper component that converts a transient prop for styled-components. This prevents exposing transient props directly in the wrapper.
```typescript
// e.g. wrapper converts `gold` to the tranient prop `$gold`
const Label = ({gold, children}) =>
```
--------------------------------
### Display GB Studio CLI Help
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
View the available commands and options for the GB Studio CLI.
```bash
$(yarn bin gb-studio-cli) --help
```
--------------------------------
### Build and Link GB Studio CLI
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Commands to build the GB Studio CLI and link it globally for use from any directory.
```bash
npm run make:cli
yarn link
```
--------------------------------
### `loadProject(projectPath)`
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Loads a GB Studio project file, applies schema migrations, scans assets, and returns a ready-to-compile project object.
```APIDOC
## `loadProject(projectPath)` — Load and Migrate a GB Studio Project
Reads a `.gbsproj` file (legacy monolithic JSON or modern split-resource format), applies all pending schema migrations, scans the project's asset directories for backgrounds, sprites, music, sounds, fonts, avatars, emotes, and tilesets, and returns a fully merged `LoadProjectResult` object ready for compilation.
```typescript
import loadProject from "lib/project/loadProjectData";
import { decompressProjectResources } from "shared/lib/resources/compression";
const result = await loadProject("/path/to/MyGame.gbsproj");
// result.isMigrated === true if the file was on an older schema version
// result.scriptEventDefs contains all built-in + plugin script event definitions
// result.engineSchema contains engine fields, scene types, and constants
const project = decompressProjectResources(result.resources);
console.log(project.metadata.name); // "My Game"
console.log(project.scenes.length); // number of scenes
console.log(project.sprites.length); // number of sprite sheets
console.log(project.music.length); // number of music tracks
// Access a specific scene's actors
const scene = project.scenes[0];
console.log(scene.actors[0].name); // "Player"
console.log(scene.actors[0].x, scene.actors[0].y); // tile coordinates
```
```
--------------------------------
### Read JSON File in Plugin API
Source: https://github.com/chrismaltby/gb-studio/blob/develop/CHANGELOG.md
Event plugins can read JSON files located in the same folder as the plugin. This example shows how to use the `readJSON` function from the `plugin-api`.
```javascript
const api = require("plugin-api");
const data = api.readJSON("./data.json");
```
--------------------------------
### Fetch GB Studio Dependencies
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Command to fetch the latest version of GBVM, GBDK, and other dependencies after checking out a new version.
```bash
cd gb-studio
npm run fetch-deps
```
--------------------------------
### Analyze ROM Bank Usage Statistics
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Invokes the `romusage` utility to get structured JSON describing used/free bytes per memory bank from a compiled ROM's `.map` file. Useful for debugging ROM size issues.
```typescript
import romUsage from "lib/compiler/romUsage";
const usage = await romUsage({
buildRoot: "/tmp/_gbsbuild",
romStem: "my-game", // matches the ROM filename without extension
tmpPath: os.tmpdir(),
progress: (msg) => console.log(msg),
warnings: (msg) => console.warn(msg),
});
// Display bank-by-bank usage
for (const bank of usage.banks) {
console.log(
`${bank.name.padEnd(20)} ${bank.usedPercent}% used [${bank.miniGraph}]`
);
}
// ROM0 42% used [####...... ]
// ROMX Bank 1 8% used [#.................]]
// ...
```
--------------------------------
### CLI: Build Web Export
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Produces a self-contained web build that can be played in a browser using the binjgb emulator. This command copies the binjgb web player, embeds the compiled ROM, and customizes `index.html` and `js/script.js` with project details such as name, author, color settings, and key mappings. The output is a static site ready for hosting.
```APIDOC
## CLI: Build Web Export
`gb-studio-cli make:web` — Produces a self-contained web build playable in a browser using the binjgb emulator.
Copies the binjgb web player, embeds the compiled ROM, and rewrites `index.html` and `js/script.js` with the project name, author, color settings, and custom key mappings. The result is a static site that can be hosted anywhere.
### Example Usage
```bash
$(yarn bin gb-studio-cli) make:web path/to/MyGame.gbsproj ./out/web-build/
```
### Expected Output Structure
```
out/web-build/
index.html <- customised with project name + author
js/script.js <- patched with correct ROM filename + color curve
rom/MyGame.gb <- compiled ROM
(binjgb player files)
# Serve locally to test:
npx serve ./out/web-build
```
```
--------------------------------
### CLI: Build ROM
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Compiles a GB Studio project (.gbsproj) into a playable .gb or .gbc ROM file. This command executes the full build pipeline, including data compilation and invoking the GBDK linker. The output file extension (.gb or .gbc) is automatically determined by the project's color mode setting. The `-v` flag enables verbose compiler output.
```APIDOC
## CLI: Build ROM
`gb-studio-cli make:rom` — Compiles a `.gbsproj` project into a playable `.gb` or `.gbc` ROM file.
This command runs the full build pipeline (compile data + invoke GBDK linker) and writes the final ROM to the specified destination path. The output extension (`.gb` vs `.gbc`) is automatically determined by the project's color mode setting.
### Example Usage
```bash
# Build a standard Game Boy ROM
$(yarn bin gb-studio-cli) make:rom path/to/MyGame.gbsproj ./out/MyGame.gb
# Build a Game Boy Color-only ROM
$(yarn bin gb-studio-cli) make:rom path/to/MyColorGame.gbsproj ./out/MyColorGame.gbc
# Build with verbose compiler output
$(yarn bin gb-studio-cli) make:rom -v path/to/MyGame.gbsproj ./out/MyGame.gb
```
### Expected Output
```
Binary ROM file at ./out/MyGame.gb
```
```
--------------------------------
### Switch to Supported Node Version with NVM
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Use NVM to switch to the Node.js version specified in the .nvmrc file for GB Studio development.
```bash
cd gb-studio
nvm use
```
--------------------------------
### `buildProject(project, options)`
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Compiles a GB Studio project by running the full compilation pipeline in a worker thread, optionally invoking the GBDK toolchain.
```APIDOC
## `buildProject(project, options)` — Programmatic Full Build
Runs the complete compilation pipeline in a Node.js Worker thread: compiles all assets and script events into GBDK C source files, then optionally invokes the GBDK toolchain to produce a ROM or web build. Supports cancellation via `cancelCompileStepsInProgress()`.
```typescript
import loadProject from "lib/project/loadProjectData";
import { decompressProjectResources } from "shared/lib/resources/compression";
import buildProject, { cancelCompileStepsInProgress } from "lib/compiler/buildProject";
import { loadEngineSchema } from "lib/project/loadEngineSchema";
import { getROMFilename } from "shared/lib/helpers/filePaths";
import os from "os";
const loaded = await loadProject("/path/to/MyGame.gbsproj");
const project = decompressProjectResources(loaded.resources);
const engineSchema = await loadEngineSchema("/path/to/MyGame");
const tmpPath = os.tmpdir();
const outputRoot = `${tmpPath}/_gbsbuild`;
const romFilename = getROMFilename(
project.settings.romFilename, // override name from project settings
project.metadata.name, // "my-game"
project.settings.colorMode === "color",
"rom", // "rom" | "web" | "pocket"
);
// romFilename => "my-game.gb"
const compiledData = await buildProject(project, {
buildType: "rom", // "rom" | "web" | "pocket"
projectRoot: "/path/to/MyGame",
tmpPath,
engineSchema,
outputRoot,
romFilename,
debugEnabled: false,
make: true, // false = compile to C only, skip GBDK invocation
progress: (msg) => console.log("[build]", msg),
warnings: (msg) => console.warn("[warn]", msg),
});
// Cancel a build in progress from another async context:
cancelCompileStepsInProgress();
```
```
--------------------------------
### Build Standard Game Boy ROM with CLI
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Compiles a GB Studio project into a playable `.gb` ROM file. The command runs the full build pipeline, including data compilation and invoking the GBDK linker.
```bash
# Build a standard Game Boy ROM
$(yarn bin gb-studio-cli) make:rom path/to/MyGame.gbsproj ./out/MyGame.gb
# Build with verbose compiler output
$(yarn bin gb-studio-cli) make:rom -v path/to/MyGame.gbsproj ./out/MyGame.gb
# Expected: binary ROM file at ./out/MyGame.gb
```
--------------------------------
### CLI: Make Game Boy ROM
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Compile a GB Studio project into a Game Boy ROM file (.gb).
```bash
$(yarn bin gb-studio-cli) make:rom path/to/project.gbsproj out/game.gb
```
--------------------------------
### Build Game Boy Color ROM with CLI
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Compiles a GB Studio project into a playable `.gbc` ROM file. The output extension determines if it's a Game Boy Color ROM. The command executes the complete build process.
```bash
# Build a Game Boy Color-only ROM
$(yarn bin gb-studio-cli) make:rom path/to/MyColorGame.gbsproj ./out/MyColorGame.gbc
```
--------------------------------
### CLI: Export GBDK Project
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Export a GB Studio project (.gbsproj) to GBDK source files in the specified output directory.
```bash
$(yarn bin gb-studio-cli) export path/to/project.gbsproj out/
```
--------------------------------
### Build Analogue Pocket ROM with CLI
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Builds a `.pocket` binary specifically for the Analogue Pocket handheld. This command uses an identical pipeline to `make:rom` but targets the Analogue Pocket platform.
```bash
$(yarn bin gb-studio-cli) make:pocket path/to/MyGame.gbsproj ./out/MyGame.pocket
# Expected: binary at ./out/MyGame.pocket
```
--------------------------------
### Build Web Export with CLI
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Produces a self-contained web build playable in a browser using the binjgb emulator. This command embeds the compiled ROM and customizes the `index.html` and `js/script.js` files.
```bash
$(yarn bin gb-studio-cli) make:web path/to/MyGame.gbsproj ./out/web-build/
# Expected output structure:
# out/web-build/
# index.html <- customised with project name + author
# js/script.js <- patched with correct ROM filename + color curve
# rom/MyGame.gb <- compiled ROM
# (binjgb player files)
# Serve locally to test:
npx serve ./out/web-build
```
--------------------------------
### Clone gb-studio Repository
Source: https://github.com/chrismaltby/gb-studio/blob/develop/CONTRIBUTING.md
Clone the gb-studio repository to your local machine using Git. Replace 'your-username' with your GitHub username.
```bash
git clone git@github.com:your-username/gb-studio.git
```
--------------------------------
### Load and Migrate GB Studio Project
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Reads a project file, applies schema migrations, scans assets, and returns a merged project object. Use this to load project data for further processing or compilation.
```typescript
import loadProject from "lib/project/loadProjectData";
import { decompressProjectResources } from "shared/lib/resources/compression";
const result = await loadProject("/path/to/MyGame.gbsproj");
// result.isMigrated === true if the file was on an older schema version
// result.scriptEventDefs contains all built-in + plugin script event definitions
// result.engineSchema contains engine fields, scene types, and constants
const project = decompressProjectResources(result.resources);
console.log(project.metadata.name); // "My Game"
console.log(project.scenes.length); // number of scenes
console.log(project.sprites.length); // number of sprite sheets
console.log(project.music.length); // number of music tracks
// Access a specific scene's actors
const scene = project.scenes[0];
console.log(scene.actors[0].name); // "Player"
console.log(scene.actors[0].x, scene.actors[0].y); // tile coordinates
```
--------------------------------
### Export Full GBDK Project Source with CLI
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Exports a GB Studio project to a full GBDK C source project directory. Use the `-d` flag to export only updated data files. The `-v` flag enables verbose output.
```bash
# Build the CLI once (from source checkout)
npm run make:cli
yarn link
# Export full GBDK project (C source + engine + data)
$(yarn bin gb-studio-cli) export path/to/MyGame.gbsproj ./out/gbdk-project/
# Export only updated data files (src/data + include/data)
$(yarn bin gb-studio-cli) export -d path/to/MyGame.gbsproj ./out/gbdk-project/
# With verbose output
$(yarn bin gb-studio-cli) export -v path/to/MyGame.gbsproj ./out/gbdk-project/
# Expected output structure:
# out/gbdk-project/
# src/
# data/ <- compiled scene/actor/script data (.c files)
# engine/ <- GBVM runtime C source files
# include/
# data/ <- generated header files
# Makefile
```
--------------------------------
### CLI: Build Analogue Pocket ROM
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Builds a .pocket binary specifically for the Analogue Pocket handheld device. This command utilizes an identical pipeline to the `make:rom` command but targets the Analogue Pocket platform, resulting in an output file with the .pocket extension.
```APIDOC
## CLI: Build Analogue Pocket ROM
`gb-studio-cli make:pocket` — Builds a `.pocket` binary for the Analogue Pocket handheld.
Identical pipeline to `make:rom` but targets the Analogue Pocket platform. The output file uses the `.pocket` extension.
### Example Usage
```bash
$(yarn bin gb-studio-cli) make:pocket path/to/MyGame.gbsproj ./out/MyGame.pocket
```
### Expected Output
```
Binary at ./out/MyGame.pocket
```
```
--------------------------------
### Update GB Studio CLI
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Rebuild the CLI after pulling the latest code changes.
```bash
npm run make:cli
```
--------------------------------
### Programmatic Full Build of GB Studio Project
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Compiles project assets and script events into GBDK C source files, optionally invoking the GBDK toolchain for ROM or web builds. Supports cancellation. Ensure project and engine schema are loaded before calling.
```typescript
import loadProject from "lib/project/loadProjectData";
import { decompressProjectResources } from "shared/lib/resources/compression";
import buildProject, { cancelCompileStepsInProgress } from "lib/compiler/buildProject";
import { loadEngineSchema } from "lib/project/loadEngineSchema";
import { getROMFilename } from "shared/lib/helpers/filePaths";
import os from "os";
const loaded = await loadProject("/path/to/MyGame.gbsproj");
const project = decompressProjectResources(loaded.resources);
const engineSchema = await loadEngineSchema("/path/to/MyGame");
const tmpPath = os.tmpdir();
const outputRoot = `${tmpPath}/_gbsbuild`;
const romFilename = getROMFilename(
project.settings.romFilename, // override name from project settings
project.metadata.name, // "my-game"
project.settings.colorMode === "color",
"rom", // "rom" | "web" | "pocket"
);
// romFilename => "my-game.gb"
const compiledData = await buildProject(project, {
buildType: "rom", // "rom" | "web" | "pocket"
projectRoot: "/path/to/MyGame",
tmpPath,
engineSchema,
outputRoot,
romFilename,
debugEnabled: false,
make: true, // false = compile to C only, skip GBDK invocation
progress: (msg) => console.log("[build]", msg),
warnings: (msg) => console.warn("[warn]", msg),
});
// Cancel a build in progress from another async context:
cancelCompileStepsInProgress();
```
--------------------------------
### CLI: Export Project Data Only
Source: https://github.com/chrismaltby/gb-studio/blob/develop/README.md
Export only the data files (src/data and include/data) from a GB Studio project.
```bash
$(yarn bin gb-studio-cli) export -d path/to/project.gbsproj out/
```
--------------------------------
### CLI: Export GBDK Project Source
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Exports a GB Studio project (.gbsproj) to a full GBDK C source project directory. This command compiles all assets and game data and copies the resulting GBDK source tree to a specified output directory. The `-d` flag can be used to export only updated data files, and `-v` enables verbose output.
```APIDOC
## CLI: Export GBDK Project Source
`gb-studio-cli export` — Exports a `.gbsproj` project to a full GBDK C source project directory.
The `export` command loads the project, compiles all assets and game data, and copies the resulting GBDK source tree (engine C files + compiled data) to an output directory. Use `-d` to export only the `src/data` and `include/data` folders when only data has changed.
### Example Usage
```bash
# Build the CLI once (from source checkout)
npm run make:cli
yarn link
# Export full GBDK project (C source + engine + data)
$(yarn bin gb-studio-cli) export path/to/MyGame.gbsproj ./out/gbdk-project/
# Export only updated data files (src/data + include/data)
$(yarn bin gb-studio-cli) export -d path/to/MyGame.gbsproj ./out/gbdk-project/
# With verbose output
$(yarn bin gb-studio-cli) export -v path/to/MyGame.gbsproj ./out/gbdk-project/
```
### Expected Output Structure
```
out/gbdk-project/
src/
data/ <- compiled scene/actor/script data (.c files)
engine/ <- GBVM runtime C source files
include/
data/ <- generated header files
Makefile
```
```
--------------------------------
### loadEngineSchema(projectRoot)
Source: https://context7.com/chrismaltby/gb-studio/llms.txt
Loads the engine configuration from the project's assets, merging plugin overrides, and returns an EngineSchema object. This schema details available engine fields, scene types, and compile-time constants.
```APIDOC
## `loadEngineSchema(projectRoot)` — Load Engine Configuration
Reads the active `engine.json` (from the project's `assets/engine/` override or the default engine), merges any `engine.json` files found in plugin directories, and returns an `EngineSchema` describing available engine fields, supported scene types, and compile-time constants.
```typescript
import { loadEngineSchema } from "lib/project/loadEngineSchema";
const schema = await loadEngineSchema("/path/to/MyGame");
// Built-in scene types
schema.sceneTypes.forEach(({ key, label })
console.log(key, "->", label)
);
// TOPDOWN -> GAMETYPE_TOP_DOWN
// PLATFORM -> GAMETYPE_PLATFORMER
// ADVENTURE -> GAMETYPE_ADVENTURE
// SHMUP -> GAMETYPE_SHMUP
// POINTNCLICK -> GAMETYPE_POINT_N_CLICK
// LOGO -> GAMETYPE_LOGO
// Engine fields exposed in the Settings UI
schema.fields.forEach((f) => console.log(f.key, f.type));
// Compile-time numeric constants (can be overridden by plugins)
console.log(schema.consts);
// { MAX_ACTORS: 30, MAX_TRIGGERS: 30, ... }
```
```