> ## Documentation Index
> Fetch the complete documentation index at: https://docs.overlayed.gg/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

# @overlayed/app

<Update label="2026-07-07" description="v1.3.11" tags={[]}>
  * fix(build): forward VITE\_\* env vars to vp run build tasks so import.meta.env.VITE\_API\_BASE\_URL/VITE\_DASHBOARD\_URL are actually replaced in published builds
</Update>

<Update label="2026-07-07" description="v1.3.10" tags={[]}>
  * chore: fix builds
</Update>

<Update label="2026-07-02" description="v1.3.9" tags={[]}>
  * fix(app): surface a clear error and bootstrap correctly when dev metadata is not cached yet, instead of the misleading "function overlayed was not called"
</Update>

<Update label="2026-06-04" description="v1.3.8" tags={[]}>
  * feat(app/siege): add map "Calpyso Casino" to consts
</Update>

<Update label="2026-05-13" description="v1.3.7" tags={[]}>
  * chore: bump internal dependencies
  * chore: update internal package versions
</Update>

<Update label="2026-04-18" description="v1.3.6" tags={[]}>
  * fix(app): keep `arktype` external in `siege` and `universal` dts so consumers don't hit
    `Type instantiation is excessively deep` / duplicate `AliasNode` errors when using
    `overlayed({ modules: [Siege.module()] })`
  * chore: fix error when no application is scoped
</Update>

<Update label="2026-04-11" description="v1.3.5" tags={[]}>
  * fix(app): remove dead dependency causing build issues
</Update>

<Update label="2026-04-11" description="v1.3.4" tags={[]}>
  * fix(app): top-level auto-updater call breaking bundle command
</Update>

<Update label="2026-04-11" description="v1.3.3" tags={[]}>
  * refactor(app): export `FeatureFlagLayers` type as the named return type of `featureFlags.inspect()`
</Update>

<Update label="2026-04-11" description="v1.3.2" tags={[]}>
  * fix(app): electron-updater cjs \<-> esm interop issues
</Update>

<Update label="2026-04-11" description="v1.3.1" tags={[]}>
  * docs: fix typos and grammar across guides
</Update>

<Update label="2026-04-11" description="v1.3.0" tags={[]}>
  * feat(app): feature flags now accept a `Record<string, boolean>` for default values and expose a `ready`
    promise for awaiting initial fetch

  * feat(app): feature flags interface now supports `clearOverride`, `clearOverrides`, `isOverridden`,
    `getAllOverrides`, and `inspect` for introspecting and managing overrides
</Update>

<Update label="2026-04-09" description="v1.2.0" tags={[]}>
  * feat(app): add feature flag support via `overlay.featureFlags` module.
    [Docs](https://docs.overlayed.gg/feature-flags/introduction)

  * chore(app): bump dependencies
</Update>

<Update label="2026-04-02" description="v1.1.19" tags={[]}>
  * chore(app): bump render-interface to v0.6.7
</Update>

<Update label="2026-04-01" description="v1.1.18" tags={[]}>
  * fix(app): issue where users cursor appears but the window does not, and input is blocked. Instead now the
    cursor wont appear and input wont be blocked.
</Update>

<Update label="2026-03-31" description="v1.1.17" tags={[]}>
  * refactor(app): remove unncessary webhook call on feedback submission
</Update>

<Update label="2026-03-25" description="v1.1.16" tags={[]}>
  * chore(app): bump dependencies
</Update>

<Update label="2026-03-23" description="v1.1.15" tags={[]}>
  * chore(app): bump dependencies
</Update>

<Update label="2026-03-23" description="v1.1.14" tags={[]}>
  * feat(app): include metadata when creating bundles
</Update>

<Update label="2026-03-22" description="v1.1.13" tags={[]}>
  * chore(app): increase injection delay
</Update>

<Update label="2026-03-22" description="v1.1.12" tags={[]}>
  * chore(app): delay injection on newly created processes
</Update>

<Update label="2026-03-22" description="v1.1.11" tags={[]}>
  * chore(app): bump dependencies
</Update>

<Update label="2026-03-22" description="v1.1.10" tags={[]}>
  * chore(app): bump dependencies
</Update>

<Update label="2026-03-22" description="v1.1.9" tags={[]}>
  * chore(app): provide crash\_identifier on game crash dump upload
</Update>

<Update label="2026-03-21" description="v1.1.8" tags={[]}>
  * fix(app): remove hardcoded release\_id in crash dumps
</Update>

<Update label="2026-03-21" description="v1.1.7" tags={[]}>
  * chore(app): update dependencies
</Update>

<Update label="2026-03-21" description="v1.1.6" tags={[]}>
  * chore(app): update dependencies
</Update>

<Update label="2026-03-21" description="v1.1.5" tags={[]}>
  * chore(app): update dependencies
</Update>

<Update label="2026-03-21" description="v1.1.4" tags={[]}>
  * chore(app): drop cortex events older than 600 seconds before submission
</Update>

<Update label="2026-03-19" description="v1.1.3" tags={[]}>
  * refactor: update crash dump endpoints
</Update>

<Update label="2026-03-18" description="v1.1.2" tags={[]}>
  * fix(app): strip Windows duplicate-download suffixes from UTM campaign codes
</Update>

<Update label="2026-03-14" description="v1.1.1" tags={[]}>
  * chore: bump internal package versions
</Update>

<Update label="2026-03-14" description="v1.1.0" tags={[]}>
  * feat: add crash dump detection and upload support via `overlay.crashDumps.on("new", ...)`. See the
    [docs](https://docs.overlayed.gg/logging/crash-dumps) for details.
</Update>

<Update label="2026-03-01" description="v1.0.3" tags={[]}>
  * feat(app/siege): add solid snake to constants
</Update>

<Update label="2026-03-01" description="v1.0.2" tags={[]}>
  * fix: bug reports not submitting when user has large amount of log files
</Update>

<Update label="2026-03-01" description="v1.0.1" tags={[]}>
  * fix: campaign codes not registering
</Update>

<Update label="2026-02-28" description="v1.0.0" tags={["Breaking"]}>
  * #### 🚀 Features

    * **Auto-updating support**: Complete implementation of application update flow including support for private
      channels
    * **Campaigns**: Ability to create UTM campaigns for tracking user acquisition
    * **Electron Window Logging**: Logs from electron windows will now be in feedback submissions
    * **Ads enhancements**: New `getAdsScriptElement` and `getAdsScriptUrl` methods for better ads integration
    * **Enhanced CLI bundling**: Improved the CLI bundling process to be more robust and reliable

    #### 📚 Documentation Improvements

    * **Deployment guides**: New [documentation](https://docs.overlayed.gg/deployment/introduction) sections on
      application deployments and updating mechanisms
    * **Refreshed docs theme**: Refreshed the docs theme
    * **Local Development**: Established guideliens for
      [local development](https://docs.overlayed.gg/advanced/local-development)

    #### 📝 Breaking Changes

    * After updating, you'll need to run `overlayed login` and then `overlayed init`. This only needs to be done once,
      and is only needed for local development.

    #### 🐛 Bug Fixes

    * Fixed broken documentation links

  * feat: internal changes for deployments

  * feat: Add app and site updater modules \[[https://docs.overlay.dev/deployment/updates](https://docs.overlay.dev/deployment/updates)]
</Update>

<Update label="2026-02-25" description="v0.36.3" tags={[]}>
  * chore: bump internal package versions
</Update>

<Update label="2026-02-22" description="v0.36.2" tags={[]}>
  * fix: stream write failed when sleeping app
  * chore(app): adjust feedback submission url
</Update>

<Update label="2026-01-06" description="v0.36.1" tags={[]}>
  * chore: temporarily revert previous changes
</Update>

<Update label="2026-01-06" description="v0.36.0" tags={[]}>
  * feat: internal changes for deployments
</Update>

<Update label="2026-01-05" description="v0.35.1" tags={[]}>
  * fix: @overlayed/app/security export
</Update>

<Update label="2026-01-05" description="v0.35.0" tags={[]}>
  * feat: add @overlayed/app/security module
</Update>

<Update label="2025-12-31" description="v0.34.10" tags={[]}>
  * fix: internal changes
</Update>

<Update label="2025-12-31" description="v0.34.9" tags={[]}>
  * chore(app): support nullable build\_hash in module releases
  * refactor: move config store internals
  * chore: update meta data
</Update>

<Update label="2025-12-21" description="v0.34.8" tags={[]}>
  * fix: console color logging
</Update>

<Update label="2025-12-20" description="v0.34.7" tags={[]}>
  * Export individual GameLaunchManager events GameLaunchEvent, GameCloseEvent, and GameReadyEvent
</Update>

<Update label="2025-12-20" description="v0.34.6" tags={[]}>
  * feat(app): adopt new game module delivery system
</Update>

<Update label="2025-12-19" description="v0.34.5" tags={[]}>
  * fix: old bug report endpoint not submitting
  * chore: bump dependencie
</Update>

<Update label="2025-12-19" description="v0.34.4" tags={[]}>
  * chore(app): fix 32-bit game support
</Update>

<Update label="2025-12-18" description="v0.34.3" tags={[]}>
  * feat(app): add support for 32bit games
</Update>

<Update label="2025-12-18" description="v0.34.2" tags={[]}>
  * chore: bump package versions
</Update>

<Update label="2025-12-18" description="v0.34.1" tags={[]}>
  * chore(app): fix build issue
</Update>

<Update label="2025-12-18" description="v0.34.0" tags={[]}>
  * feat(app): add notices
</Update>

<Update label="2025-12-14" description="v0.33.1" tags={[]}>
  * fix(app): correctly send version, channel, and extra data
</Update>

<Update label="2025-12-14" description="v0.33.0" tags={[]}>
  * feat(app): BREAKING - submitBugReport is now submitFeedback and takes a type
</Update>

<Update label="2025-12-10" description="v0.32.3" tags={[]}>
  * chore: bump dependencies
</Update>

<Update label="2025-12-10" description="v0.32.2" tags={[]}>
  * chore: bump dependencies
</Update>

<Update label="2025-12-10" description="v0.32.1" tags={[]}>
  * chore: bump dependencies
</Update>

<Update label="2025-12-09" description="v0.32.0" tags={[]}>
  * feat(app): support conditional rendering / dll injection
</Update>

<Update label="2025-12-09" description="v0.31.6" tags={[]}>
  * chore(app): bump dependencies
</Update>

<Update label="2025-12-09" description="v0.31.5" tags={[]}>
  * chore: bump dependencies
</Update>

<Update label="2025-12-08" description="v0.31.4" tags={[]}>
  * chore(app): update dependencies
</Update>

<Update label="2025-12-07" description="v0.31.3" tags={[]}>
  * chore(app): validate `applicationID` passed to `overlayed` and `defineConfig` is a valid ULID
    feat(app/siege): add `platform` to player\_joined event
</Update>

<Update label="2025-12-04" description="v0.31.2" tags={[]}>
  * fix(app): log level 'log' -> info, dont attempt to register already registered processes
</Update>

<Update label="2025-12-02" description="v0.31.1" tags={[]}>
  * refactor(overlay): update event communication channel
</Update>

<Update label="2025-11-30" description="v0.31.0" tags={[]}>
  * feat(app/siege): add `headshot` to player\_died event
</Update>

<Update label="2025-11-30" description="v0.30.1" tags={[]}>
  * fix: .node file not found
</Update>

<Update label="2025-11-30" description="v0.30.0" tags={[]}>
  * feat(app/siege): add damage\_hit\_zone, damage\_source\_id to round end damage events. Also add
    SIEGE\_DAMAGE\_HIT\_ZONES.
</Update>

<Update label="2025-11-16" description="v0.29.0" tags={[]}>
  * refactor(app/siege): remove player\_stats\_changed event in favor of smaller events like
    player\_kills\_changed
</Update>

<Update label="2025-11-15" description="v0.28.1" tags={[]}>
  * chore(app): export ModuleLoadedEvent, ModuleUnloadedEvent, UnsupportedGameVersionEvent types
</Update>

<Update label="2025-11-15" description="v0.28.0" tags={[]}>
  * refactor(app/siege): move module\_loaded, module\_unloaded, unsupported\_game\_version to universal events
</Update>

<Update label="2025-11-08" description="v0.27.1" tags={[]}>
  * fix(app): logs will now log in UTC
</Update>

<Update label="2026-03-14" description="v0.27.0" tags={[]}>
  * Add `overlayed.universal` event listeners. [Docs](https://docs.overlayed.gg/games/universal/events)
</Update>

<Update label="2025-11-01" description="v0.26.2" tags={[]}>
  * fix(app): game\_ready event doesn't trigger `.on` called after game is ready
</Update>

<Update label="2025-10-30" description="v0.26.1" tags={[]}>
  * chore(app): add logs around events
</Update>

<Update label="2025-10-28" description="v0.26.0" tags={[]}>
  * chore(app/siege): BREAKING - remove map.id from event types
</Update>

<Update label="2025-10-26" description="v0.25.3" tags={[]}>
  * chore(app): add debug tools
</Update>

<Update label="2025-10-22" description="v0.25.2" tags={[]}>
  * feat(siege): add constants for halloween event
  * fix(app): only download dll when update is needed
  * fix(app/siege): missing map id
</Update>

<Update label="2025-10-18" description="v0.25.1" tags={[]}>
  * fix(app): allow multiple listeners per keybind
</Update>

<Update label="2025-10-15" description="v0.25.0" tags={[]}>
  * feat(app/siege): add `operator_ban_voting_started` and `operator_ban_cleared` events
</Update>

<Update label="2025-10-11" description="v0.24.5" tags={[]}>
  * feat(app/siege): add PlayerDamageDataSchema#damage\_item\_instance\_id
</Update>

<Update label="2025-10-07" description="v0.24.4" tags={[]}>
  * refactor(app/siege):
    * Removed strict validation on `SiegeGameModePhase`, `SiegeSide`, `SiegePlayerLifeState`, `SiegeDamageType`, and
      `SiegeDamageTeamType`. Now validates that its a string, but nothing more.
    * Add 3 new SIEGE\_DAMAGE\_TYPES: `"melee-pushback"`, `"supressive-fire"`, `"gas-pipe-fire"`,
    * Add 1 new SIEGE\_GAME\_MODE\_PHASES: `"first"`
</Update>

<Update label="2025-10-06" description="v0.24.3" tags={[]}>
  * chore: update dependencies

    fix: various types exported from @overlayed/app like RenderWindow, etc.
</Update>

<Update label="v0.24.2" description="v0.24.2" tags={[]}>
  * test(app): actions
</Update>

<Update label="v0.24.1" description="v0.24.1" tags={[]}>
  * fix(app): send app build version
</Update>

<Update label="v0.24.0" description="v0.24.0" tags={[]}>
  * feat(app): add `hasAnyActiveGames` utility
</Update>

<Update label="v0.23.0" description="v0.23.0" tags={[]}>
  * feat(app): add `hasAnyActiveGames` utility
</Update>

<Update label="v0.22.2" description="v0.22.2" tags={[]}>
  * fix(app): properly stringify various data types like errors, maps, sets, etc
</Update>

<Update label="v0.22.1" description="v0.22.1" tags={[]}>
  * fix(app): reuse previous session if last used less than 5 minutes ago
</Update>

<Update label="v0.22.0" description="v0.22.0" tags={[]}>
  * feat(app/siege): add missing consts for game\_mode\_type and maps

  * chore(app/siege): remove PlayerMatchStatsDataSchema#plants
</Update>

<Update label="v0.21.0" description="v0.21.0" tags={[]}>
  * feat(app): add baseDir option to overlayed config bundle configs
</Update>

<Update label="v0.20.0" description="v0.20.0" tags={[]}>
  * feat(app/siege): add game\_log event
</Update>

<Update label="v0.19.2" description="v0.19.2" tags={[]}>
  * fix(app/siege): player\_joined missing branded type for profile\_id
</Update>

<Update label="v0.19.1" description="v0.19.1" tags={[]}>
  * fix(app): overlayed-gg imports not renamed
</Update>

<Update label="v0.19.0" description="v0.19.0" tags={[]}>
  * feat(app/siege): add denari to operator records
</Update>

<Update label="v0.18.4" description="v0.18.4" tags={[]}>
  * fix(app): add missing time\_of\_day type
</Update>

<Update label="v0.18.3" description="v0.18.3" tags={[]}>
  * fix(app/siege): missing game\_mode and match\_type types
</Update>

<Update label="v0.18.2" description="v0.18.2" tags={[]}>
  * feat(app): expose `silent` option to log internal logs to console, refactor cortex in\_game internals
</Update>

<Update label="v0.18.1" description="v0.18.1" tags={[]}>
  * feat(app): dont send game events through cortex
  * feat(app/cortex): also emit game\_ready
</Update>

<Update label="v0.18.0" description="v0.18.0" tags={[]}>
  * refactor(app): internals
</Update>

<Update label="v0.17.5" description="v0.17.5" tags={[]}>
  * fix(app): adjust cortex date logic
  * fix(app): invalid dates being sent with cortex
</Update>

<Update label="v0.17.4" description="v0.17.4" tags={[]}>
  * fix: cortex events using the wrong date
</Update>

<Update label="v0.17.3" description="v0.17.3" tags={[]}>
  * chore(app): update packages
</Update>

<Update label="v0.17.2" description="v0.17.2" tags={[]}>
  * chore(app): update package versions
</Update>

<Update label="v0.17.1" description="v0.17.1" tags={[]}>
  * feat(app): update native interface
  * fix: remove hard coded games from list
</Update>

<Update label="v0.17.0" description="v0.17.0" tags={[]}>
  * fix(app/siege): add game event flushing - now you must call readyForGameEvents when you're ready to listen to
    game events
</Update>

<Update label="v0.16.6" description="v0.16.6" tags={[]}>
  * fix(app): submitBugReport fails
</Update>

<Update label="v0.16.5" description="v0.16.5" tags={[]}>
  * chore: bump package versions
  * feat(app): extend log persistence duration to 7 days (from 3)
</Update>

<Update label="v0.16.4" description="v0.16.4" tags={[]}>
  * fix(app): recursively read subfolders and files for bug submission
</Update>

<Update label="v0.16.3" description="v0.16.3" tags={[]}>
  * feat(logger): color log output and improve format
  * fix(app): Object not destroyed error
</Update>

<Update label="v0.16.2" description="v0.16.2" tags={[]}>
  * fix(app): expose LoggerScope type
</Update>

<Update label="v0.16.1" description="v0.16.1" tags={[]}>
  * fix(app): logger doesnt include timestamp in console logs
  * fix(app): dont log internal logs to console by default
</Update>

<Update label="v0.16.0" description="v0.16.0" tags={[]}>
  * feat(app): add log.debug method which logs when debug: true is passed

  * fix(app/siege): missing siege game modes
</Update>

<Update label="v0.15.0" description="v0.15.0" tags={[]}>
  * feat(app):
    * BREAKING - Renamed `createWindow` to `createInGameWindow`
    * BREAKING - New `createWindow` method that should be used instead of `new BrowserWindow`
    * Integrate internal cortex events

  * feat(app/siege): expose Translation type
</Update>

<Update label="v0.14.1" description="v0.14.1" tags={[]}>
  * fix: built package size
</Update>

<Update label="v0.14.0" description="v0.14.0" tags={[]}>
  * feat(app): expose defineConfig function & related types for bundling apps.

    ```ts theme={null}
    // overlayed.config.ts
    export default defineConfig({
      // ...
    });
    ```
</Update>

<Update label="v0.13.1" description="v0.13.1" tags={[]}>
  * fix(app/siege): match started event incorrect validation rule
</Update>

<Update label="v0.13.0" description="v0.13.0" tags={[]}>
  * feat(app): add branded types to siege events

  * refactor: change internal build system
</Update>

<Update label="v0.12.0" description="v0.12.0" tags={[]}>
  * feat(app): add log module
</Update>

<Update label="v0.11.0" description="v0.11.0" tags={[]}>
  * refactor(app/siege): BREAKING - expose more consts, rename existing costs to consistent naming, expose all
    siege vars, functions, and types at top level instead of in a Siege object.
</Update>

<Update label="v0.10.2" description="v0.10.2" tags={[]}>
  * chore(app): bump package versions
</Update>

<Update label="v0.10.1" description="v0.10.1" tags={[]}>
  * fix(app): getAppInfo not returning userId when called a second time
</Update>

<Update label="v0.10.0" description="v0.10.0" tags={[]}>
  * feat(app): expose cortex
</Update>

<Update label="v0.9.2" description="v0.9.2" tags={[]}>
  * fix: contextBridge not defined
</Update>

<Update label="v0.9.1" description="v0.9.1" tags={[]}>
  * fix(app): api misconfiguration for siege
</Update>

<Update label="v0.9.0" description="v0.9.0" tags={[]}>
  * feat: add ads support
</Update>
