blr.config.json stores project state and project-level behavior.
It does not store machine-local runtime overrides such as:
- BDS version
- BDS cache directory
- BDS server directory
- Minecraft development root
- Minecraft product target
Those belong to CLI flags or environment variables.
Project-aware commands also load the closest .env.local automatically before resolving config and environment-based overrides.
Canonical build and package output belongs under dist/:
dist/stage/for staged build output consumed bylocal-deploy,local-server, and packagingdist/packages/for packaged distributable artifacts
CLI runtime/provisioning state belongs under .blr/.
Interactive prompt silence and internal world sync state both live under .blr/state/.
Generated projects start with:
{
"$schema": "./node_modules/@blurengine/cli/schema/blr.config.schema.json",
"schemaVersion": 1,
"projectVersion": 1,
"namespace": "my_namespace",
"minecraft": {
"channel": "stable",
"targetVersion": "1.26.0.2"
}
}- optional in practice but generated as
1 - if present, must be
1
- generated and managed by
blr - points editors such as VS Code and Cursor at the packaged JSON Schema for
blr.config.json
Current generated value:
"$schema": "./node_modules/@blurengine/cli/schema/blr.config.schema.json"Behavior:
- enables completion, hover descriptions, and validation in editors that support JSON Schema
blr upgradereconciles this field if it is missing or stale- the schema file shipped in
@blurengine/cliis generated automatically from TypeScript definitions during the package build and prepack flow
Note:
- this local package path works well for npm/pnpm-style installs where
node_modules/is present - once
@blurengine/cliis published, it becomes easier to switch this to a hosted schema URL if we want editor support that does not depend onnode_modules/
- generated and managed by
blr - tracks the generated-project scaffold contract, not the config schema
- current value:
1
Behavior:
- normal project commands expect the project to already be on the current
projectVersion - if the project is behind,
blrtells you to runblr upgradefirst blr upgraderuns ordered project migrations and then updates this field
Notes:
schemaVersionandprojectVersionare intentionally separateschemaVersionis for the shape ofblr.config.jsonprojectVersionis for the overall generated-project layout and managed scaffold behavior
- required
- project namespace used by BlurEngine project logic
Optional project-level Minecraft targeting.
Fields:
channel:stable | previewtargetVersion: target Minecraft version, for example1.26.0.2
Behavior:
- drives the project target version that
blruses for:- packaged world-template
base_game_version - default BDS version when no CLI or machine-local env override is provided
- packaged world-template
- drives the project Bedrock release channel across:
- BDS stable vs preview download resolution
- interactive
blr devupdate prompting - local-deploy auto-detection preference order when the deploy product is still
auto
- pack manifests keep their authored
header.min_engine_version;blr buildandblr devdo not rewrite that field during staging - during interactive
blr devruns that selectlocal-server,blrcan prompt to update this field when the active local-server version came fromblr.config.json - CLI- or environment-sourced version overrides do not trigger
devupgrade prompts forminecraft.targetVersion blr minecraft checkandblr minecraft updateprovide the same version workflow without startingdev- must be a valid
major.minor.patchormajor.minor.patch.buildMinecraft version
Defaults if omitted:
channel:stabletargetVersion:1.26.0.2
Notes:
- this does not currently auto-resolve the correct
@minecraft/*npm dependency matrix for arbitrary versions - dependency alignment remains governed by the CLI baseline and
blr upgrade
Optional project-level upgrade behavior.
Fields:
refreshAgents: whetherblr upgradeshould refresh managedAGENTS.mdcontent by defaultrefreshDependencies: whetherblr upgradeshould refresh dependency baselines inpackage.jsonby default
Defaults if omitted:
refreshAgents:truerefreshDependencies:true
Behavior:
blr upgradealways runs project scaffold migrations up to the currentprojectVersionrefreshDependenciesonly controls dependency baseline alignmentrefreshAgentsonly controls managedAGENTS.mdrefreshblr upgradealso reconciles managed package scripts and the managed.gitignoreblock
Optional world source backend configuration.
Fields:
backend:local | s3s3.bucket: bucket name for remote world storages3.region: region for the S3 clients3.endpoint: optional custom S3-compatible endpoints3.keyPrefix: optional static prefix prepended to all world objectss3.projectPrefix: whether to include the project name in object keyss3.forcePathStyle: path-style addressing for S3-compatible providers that require its3.lockTtlSeconds: default remote lock TTL
Defaults if omitted:
backend:locals3.bucket: emptys3.region: empty in config, then resolved fromAWS_REGION/AWS_DEFAULT_REGION, thenus-east-1s3.endpoint: emptys3.keyPrefix:worldss3.projectPrefix:falses3.forcePathStyle:falses3.lockTtlSeconds:14400
Notes:
blr.config.jsonstores backend coordinates, not credentials- credentials should come from the AWS SDK default credential chain, such as:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKENAWS_PROFILE
s3.endpointands3.forcePathStyleallow S3-compatible backends such as MinIO, R2, and similar services- object keys are readable and stable:
<keyPrefix>/<worldName>.zip<keyPrefix>/<worldName>.lock.json
- if
projectPrefixis enabled, the layout becomes:<keyPrefix>/<projectName>/<worldName>.zip<keyPrefix>/<projectName>/<worldName>.lock.json
- bucket versioning is required for versioned remote world workflows:
blr world pullblr world versionsblr world pull --version-idblr world push- remote world sync behavior in
blr dev
blr world listandblr world statusstill work when bucket versioning is unavailable- the lock object is the concurrency boundary; world naming is no longer overloaded with hashes
blr devandblr packageconsume the local project world source- successful versioned remote world pull and push operations create or refresh
worlds/worlds.json worlds/worlds.jsononly appears afterblr worldestablishes remote version state; generated projects do not create it up front- tracked world entries store:
nameremoteFingerprintversionId
blr world pushalso writes BlurEngine provenance onto the uploaded object by using standard S3 user metadata through the SDKMetadatafield- that provenance can include who pushed the world and the optional push reason
- this is not AWS-only naming; S3-compatible providers that preserve object metadata can expose the same information
- if a provider strips or does not return that metadata,
blrtreats push provenance as unavailable and says so in command output remoteFingerprintletsblrdetect when the currentblr.config.jsonpoints at a different remote world lineage than the stored project pin- if that fingerprint drifts,
blrignores the stale pin until the next successful remote world action refreshes it - internal runtime bookkeeping lives in
.blr/state/world-state.json - that internal state tracks:
- the last remote version materialized into the project world
- the last project-world source seeded into the local-server runtime world
- the active local-server watch-world session, when present
.blr/cache/worlds/now keeps only downloaded zip archives:.blr/cache/worlds/<bucket>/<worldName>/<encodedVersionId>.zip
- temporary extracted world copies and cache
metadata.jsonare not kept after a pull - version-aware world sync is not supported without bucket versioning:
blr world pullblr world versionsblr world pushblr devproject-world remote sync
blr devstays lenient about local world edits and usesworlds/worlds.jsonas the project truth instead of trying to infer remote freshness from local files alone
Optional project-level packaging defaults.
Fields:
defaultTarget: default package target used whenblr packageis run without a targetworldTemplate.include.behaviorPack: include the behavior pack inworld-templatepackaging by defaultworldTemplate.include.resourcePack: include the resource pack inworld-templatepackaging by default
Supported values:
world-template
Behavior:
- if
blr package <target>is passed explicitly, that wins - if the target is omitted,
blrusespackage.defaultTargetwhen present - if the target is omitted and there is only one supported packaging target,
blruses that target automatically - if the target is omitted and packaging targets become ambiguous in the future,
blrrequires an explicit target orpackage.defaultTarget worldTemplate.include.*defaults follow project feature presence:- behavior pack present -> behavior pack included by default
- resource pack present -> resource pack included by default
- these defaults can be narrowed per run with:
--include-behavior-pack--include-resource-pack
Optional overrides for the script build.
Fields:
entry: override script entry fileoutFile: override the bundled script output path before it is synced intodist/stagetarget: override esbuild targetsourcemap: override sourcemap behaviorexternalModules: override external Bedrock module list
Defaults if omitted:
entry: inferred fromsrc/main.ts, thensrc/main.js; left empty when neither existsoutFile:dist/scripts/main.jstarget:es2022sourcemap:trueexternalModules:@minecraft/server@minecraft/server-ui@minecraft/server-admin@minecraft/server-net
Notes:
- projects without a runtime entry still build and stage pack content normally
- script bundling is skipped until a runtime entry exists
- runtime scripting requires a behavior pack to be present in the project
Optional project watch configuration.
Fields:
paths: project-relative glob-style path patterns watched byblr devdebounceMs: watcher debouncescriptsEnabledByDefault: default selection forwatch-scriptsworldEnabledByDefault: default selection forwatch-worldallowlistEnabledByDefault: default selection forwatch-allowlist
Defaults if omitted:
src/**/*behavior_packs/**/*resource_packs/**/*scriptsEnabledByDefault:trueworldEnabledByDefault:falseallowlistEnabledByDefault:true
Notes:
watch-scriptstreats runtime source changes as rebuild-and-reload changes- behavior-pack and resource-pack changes are rebuilt and resynced without sending
reloadto local-server blr.config.jsonandpackage.jsonare not watched by default because those changes usually need a freshdevrun rather than a live reload- if you explicitly add
blr.config.jsonorpackage.jsontodev.watch.paths,blrprints a restart notice and skips the reload
Project-level local deploy behavior.
Fields:
enabledByDefault: whetherlocal-deploystarts selected by defaultcopy.behaviorPack: deploy the behavior pack duringlocal-deploycopy.resourcePack: deploy the resource pack duringlocal-deploy
Defaults if omitted:
enabledByDefault:falsecopy.behaviorPack: follows project feature presencecopy.resourcePack: follows project feature presence
Notes:
blr devuses these values directly during its default config-driven mode- these settings control pack deployment only
- they do not affect whether the
local-deployaction itself is selected - per-run CLI overrides:
--local-deploy-behavior-pack--local-deploy-resource-pack
Project-level local server behavior.
Fields:
enabledByDefault: whetherlocal-serverstarts selected by defaultworldName: active BDS world nameworldSourcePath: project-owned raw world source pathrestartOnWorldChange: restart/reset server world when the project world source changescopy.behaviorPack: sync the behavior pack into the provisioned local servercopy.resourcePack: sync the resource pack into the provisioned local serverattach.behaviorPack: attach the behavior pack inworld_behavior_packs.jsonattach.resourcePack: attach the resource pack inworld_resource_packs.jsonallowlist: optional XUID list when noserver/allowlist.jsonfile existsoperators: optional XUID list when noserver/permissions.jsonfile existsdefaultPermissionLevel: server default permission levelgamemode: server default gamemodeworldSync.projectWorldMode:prompt | auto | manualworldSync.runtimeWorldMode:prompt | preserve | replace | backup
Defaults if omitted:
enabledByDefault:trueworldName:Bedrock levelworldSourcePath:worlds/<worldName>restartOnWorldChange:truecopy.behaviorPack: follows project feature presencecopy.resourcePack: follows project feature presenceattach.behaviorPack: follows project feature presenceattach.resourcePack: follows project feature presencedefaultPermissionLevel:operatorgamemode:creativeworldSync.projectWorldMode:promptworldSync.runtimeWorldMode:prompt
Notes:
blr devuses these values directly during its default config-driven modeblr createdoes not generate an empty world placeholder- world-aware commands such as
watch-worldandpackage world-templaterequire that path to contain a real Bedrock world with adb/directory blr dev --world <worldName>andblr package --world <worldName>can override the configured active world for a single runblr world use <worldName>updates the configured active world and keeps the defaultworlds/<worldName>source-path convention unless the project has an explicit customworldSourcePathcopy.*controls whether the current project pack types are copied into the runtime serverattach.*controls whether the current project pack ids are written into world hook files- if a pack type is disabled for copy or attach,
blrremoves only this project's corresponding staged/runtime output and preserves unrelated existing world pack entries worldSync.projectWorldModecontrols howblr devhandles remote project-world updates for versioned S3 worlds:prompt: prompt when a newer remote world exists, and prompt or fail when a required pull is neededauto: pull automatically when reconciliation is neededmanual: never pull automatically
worldSync.runtimeWorldModecontrols howblr devhandles replacing the runtime BDS world from the project world:prompt: ask before replacing an existing runtime worldpreserve: keep the existing runtime worldreplace: replace the runtime world automatically before startupbackup: move the existing runtime world intoworlds_backups/and then replace it
- runtime-world replacement and backup only happen before BDS starts;
blrdoes not modify a running server world watch-worldstarts after startup reconciliation and captures runtime world state back into the project source- optional newer-remote prompts can be silenced for 24 hours on a per-world basis
- per-run CLI overrides:
--local-server-behavior-pack--local-server-resource-pack--attach-behavior-pack--attach-resource-pack
blr intentionally infers the rest from the project:
- project features
behavior_packs/*/manifest.json-> behavior-pack feature enabledresource_packs/*/manifest.json-> resource-pack feature enabledsrc/main.ts,src/main.js, or explicitruntime.entry-> scripting feature enabled- scripting requires a behavior pack
- a project must contain at least one pack manifest
package.json- package name
- package version
- package manager
behavior_packs/*/manifest.json- pack directory
- header UUID/version
- script module UUID
resource_packs/*/manifest.json- pack directory
- header UUID/version
- source conventions
- entrypoint
- output path defaults
- staged build output under
dist/stage
Config-backed overrides:
- supported
blr.config.jsonfields can be overridden withBLR_environment variables - naming rule:
- take the config path
- uppercase each segment exactly as written
- join the segments with a single underscore
- do not split camelCase into separate words
- examples:
namespace->BLR_NAMESPACEminecraft.channel->BLR_MINECRAFT_CHANNELminecraft.targetVersion->BLR_MINECRAFT_TARGETVERSIONdev.localServer.worldName->BLR_DEV_LOCALSERVER_WORLDNAMEdev.localServer.worldSync.projectWorldMode->BLR_DEV_LOCALSERVER_WORLDSYNC_PROJECTWORLDMODEdev.localServer.worldSync.runtimeWorldMode->BLR_DEV_LOCALSERVER_WORLDSYNC_RUNTIMEWORLDMODEdev.localDeploy.copy.behaviorPack->BLR_DEV_LOCALDEPLOY_COPY_BEHAVIORPACKdev.localServer.attach.resourcePack->BLR_DEV_LOCALSERVER_ATTACH_RESOURCEPACKpackage.worldTemplate.include.behaviorPack->BLR_PACKAGE_WORLDTEMPLATE_INCLUDE_BEHAVIORPACKworld.s3.keyPrefix->BLR_WORLD_S3_KEYPREFIXpackage.defaultTarget->BLR_PACKAGE_DEFAULTTARGET
- array fields accept comma-separated or newline-separated values
- invalid boolean or numeric env values fail fast instead of silently falling back
Machine-local overrides:
BLR_MACHINE_LOCALSERVER_BDSVERSIONBLR_MACHINE_LOCALSERVER_BDSPLATFORMBLR_MACHINE_LOCALSERVER_BDSCACHEDIRECTORYBLR_MACHINE_LOCALSERVER_BDSSERVERDIRECTORYBLR_MACHINE_LOCALDEPLOY_MINECRAFTPRODUCTBLR_MACHINE_LOCALDEPLOY_MINECRAFTDEVELOPMENTPATHBLR_MACHINE_DEBUGBLR_WORLD_ACTOR
S3 credential and SDK variables commonly used in .env.local:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKENAWS_REGIONAWS_DEFAULT_REGIONAWS_PROFILE
Security notes:
- keep secrets in
.env.local, not inblr.config.json - generated projects ignore
.env.localby default blrloads.env.localwithout overriding environment variables that are already set by the shell or CI- world names from config, env, and CLI are validated before they are used as local world-source paths or BDS world names
runtime.entry,runtime.outFile,dev.localServer.worldSourcePath, anddev.watch.pathsare validated to stay within the project-owned path surface
If neither CLI flags nor environment variables override them, blr uses:
- Minecraft product:
auto - Minecraft development path: auto-detected by deploy logic when possible
- on Windows,
autocurrently checks:- for
minecraft.channel = stable:%APPDATA%/Minecraft Bedrock/Users/Shared/games/com.mojang%LOCALAPPDATA%/Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState/games/com.mojang%APPDATA%/Minecraft Bedrock Preview/Users/Shared/games/com.mojang%LOCALAPPDATA%/Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState/games/com.mojang
- for
minecraft.channel = preview:%APPDATA%/Minecraft Bedrock Preview/Users/Shared/games/com.mojang%LOCALAPPDATA%/Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState/games/com.mojang%APPDATA%/Minecraft Bedrock/Users/Shared/games/com.mojang%LOCALAPPDATA%/Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState/games/com.mojang
- for
- on Windows,
- BDS version:
1.26.0.2 - when
minecraft.targetVersionis set, that becomes the default BDS version before machine-local overrides are considered - BDS platform:
auto - BDS cache directory:
.blr/cache/bds - BDS server directory template:
.blr/bds/{version}/server - Debug logging: disabled
- World lock actor label: system username, or
BLR_WORLD_ACTORwhen set
For config-backed project values:
- explicit CLI flags or command arguments
BLR_environment variablesblr.config.json- built-in defaults
For machine-local runtime values:
- CLI flags
- machine-local
BLR_*environment variables - built-in defaults
blr.config.json is not part of that precedence chain for machine-local overrides.
For blr upgrade managed AGENTS refresh:
- CLI
--refresh-agents blr.config.json -> upgrade.refreshAgents- built-in default
true
For blr upgrade dependency baseline refresh:
- CLI
--refresh-dependencies blr.config.json -> upgrade.refreshDependencies- built-in default
true