Skip to content

Configuration File

GemShell saves all settings to gemshell.config.json in your game folder.

File Location

my-game/
├── index.html
├── game.js
└── gemshell.config.json    <-- Configuration file

Full Schema

Keys are snake_case. This is exactly what GemShell writes for a fresh project:

json
{
  "app": {
    "name": "My Game",
    "version": "1.0.0",
    "entrypoint": "index.html",
    "icon": null,
    "splash": false,
    "debug": false
  },
  "window": {
    "title": "",
    "width": 1280,
    "height": 720,
    "min_width": 800,
    "min_height": 600,
    "resizable": true,
    "start_fullscreen": false,
    "always_on_top": false,
    "frameless": false,
    "lock_aspect_ratio": false,
    "node_integration": true
  },
  "permissions": {
    "media": false
  },
  "steamworks": {
    "enabled": false,
    "app_id": 480
  },
  "exclude": [],
  "build": {
    "platforms": { "windows": true, "mac": true, "linux": true },
    "architectures": [],
    "optimization": {
      "asset_compression": false,
      "code_minification": false,
      "remove_unused": false,
      "remove_console_logs": false,
      "bundle_cdn": false
    },
    "output_path": "",
    "author": "",
    "app_name": "my-game"
  },
  "plugins": {},
  "ios": false,
  "android": false,
  "mobile": {
    "bundle_id": "",
    "min_ios_version": "16.0",
    "min_android_sdk": 24
  }
}

Deploy targets (steam_deploy, itch_deploy, github_deploy) are written once you configure them in the Deploy tab.

Properties

app

PropertyTypeDefaultDescription
app.namestring""Display name — window title, About dialog
app.versionstring"1.0.0"Version string
app.entrypointstring"index.html"HTML file to load
app.iconstring | nullnullPath to the icon image
app.splashbooleanfalseShow the splash screen on launch
app.debugbooleanfalseOpen DevTools, enable the DevTools shortcut

window

PropertyTypeDefaultDescription
window.width / heightnumber1280 / 720Initial size
window.min_width / min_heightnumber800 / 600Minimum size
window.resizablebooleantrueAllow resizing
window.start_fullscreenbooleanfalseLaunch fullscreen
window.always_on_topbooleanfalseKeep above other windows
window.framelessbooleanfalseHide the OS window frame
window.lock_aspect_ratiobooleanfalseKeep width/height ratio when resizing
window.node_integrationbooleantrueNode.js in the renderer — turn off for jQuery and other global scripts

build

PropertyTypeDefaultDescription
build.app_namestringTechnical name; used for the executable and save folder
build.authorstring""Shown in the About dialog and Windows file properties
build.output_pathstring""Where builds are written (empty = default location)
build.platformsobjectall trueCoarse platform toggles
build.architecturesstring[][]Exact targets to build; takes precedence over platforms
build.optimization.asset_compressionbooleanfalseRecompress images and audio
build.optimization.code_minificationbooleanfalseMinify JS/CSS/HTML
build.optimization.remove_unusedbooleanfalseDrop assets nothing references
build.optimization.remove_console_logsbooleanfalseStrip console.log calls
build.optimization.bundle_cdnbooleanfalseDownload CDN scripts into the bundle

Available Architectures

ValueDescription
mac-arm64macOS Apple Silicon
mac-x64macOS Intel
windows-x64Windows 64-bit
windows-arm64Windows ARM
windows-ia32Windows 32-bit (legacy)
linux-x64Linux 64-bit
linux-arm64Linux ARM
ios / androidMobile (Pro)

steamworks

PropertyTypeDefaultDescription
steamworks.enabledbooleanfalseEnable the Steam API
steamworks.app_idnumber480Steam App ID — a number, not a string

exclude

PropertyTypeDefaultDescription
excludestring[][]Glob patterns for files to keep out of the build
json
{ "exclude": ["*.psd", "*.ai", "src/**", "*.map"] }

plugins

PropertyTypeDefaultDescription
plugins.[id].enabledbooleanfalseEnable the plugin for this game
plugins.[id].valuesobject{}Setting overrides for that plugin

mobile

PropertyTypeDefaultDescription
mobile.bundle_idstring""Reverse-DNS bundle identifier
mobile.min_ios_versionstring"16.0"Minimum iOS version
mobile.min_android_sdknumber24Minimum Android SDK level

Permissions

Web capabilities are denied by default. Opt in per capability:

json
{
  "permissions": {
    "media": true
  }
}
KeyDefaultWhat it allows
mediafalsenavigator.mediaDevices.getUserMedia() — microphone and camera

Also available as Allow Microphone & Camera in Game Settings → Window Options.

Scope

media is granted only to your own game content. If your game loads a remote page (an iframe, an embedded widget), that page still cannot reach the microphone. The operating system asks the player separately — on macOS you additionally need NSMicrophoneUsageDescription, which GemShell ships in the bundle.

Without this, getUserMedia fails

Before this option existed, getUserMedia({ audio: true }) rejected with NotAllowedError in packaged builds even after the OS prompt was accepted, because the runtime denied Electron's media permission outright.

Example Configurations

Minimal

json
{
  "app": { "name": "My Game", "version": "1.0.0" },
  "build": { "app_name": "my-game" }
}

Steam Release

json
{
  "app": { "name": "My Steam Game", "version": "1.0.0" },
  "window": {
    "width": 1920,
    "height": 1080,
    "start_fullscreen": true
  },
  "steamworks": {
    "enabled": true,
    "app_id": 123456
  },
  "build": {
    "app_name": "my-steam-game",
    "architectures": ["mac-arm64", "mac-x64", "windows-x64", "linux-x64"],
    "optimization": {
      "code_minification": true,
      "asset_compression": true,
      "remove_console_logs": true
    }
  }
}

itch.io / Direct Distribution

json
{
  "app": { "name": "My Game", "version": "1.0.0" },
  "build": {
    "app_name": "my-game",
    "architectures": ["mac-arm64", "mac-x64", "windows-x64", "linux-x64"],
    "optimization": { "code_minification": true, "asset_compression": true }
  }
}

Development

json
{
  "app": { "name": "My Game (Dev)", "version": "0.1.0", "debug": true },
  "build": {
    "app_name": "my-game-dev",
    "architectures": ["mac-arm64"]
  },
  "plugins": {
    "debug-tools": {
      "enabled": true,
      "values": { "fpsCounter": true, "memoryUsage": true }
    }
  }
}

Game using jQuery or other global scripts

json
{
  "app": { "name": "My Game", "version": "1.0.0" },
  "window": { "node_integration": false },
  "build": { "app_name": "my-game" }
}

Auto-Save

GemShell automatically saves settings when you:

  • Change any setting in the UI
  • Navigate between steps
  • Close the application

Changes are debounced (500ms delay) to prevent excessive writes.

Manual Editing

You can edit gemshell.config.json directly:

  1. Close GemShell (or it will overwrite your changes)
  2. Edit the JSON file
  3. Reopen the game in GemShell

Version Control

Add gemshell.config.json to your Git repository to share build settings with your team.

gitignore
# .gitignore - Do NOT ignore config
# gemshell.config.json  <-- Keep this tracked