Skip to content

Configuration

EmberMC's settings live next to Paper's, use the same file conventions, and are loaded by the same machinery - Paper's Configurate-based system, reused rather than duplicated. If you know paper-global.yml, you already know how these work.

File Scope
config/ember-global.yml the server
config/ember-world-defaults.yml every world, unless a world overrides a key
<world>/ember-world.yml one world's overrides - only the keys it changes. Lives next to Paper's paper-world.yml, e.g. world/dimensions/minecraft/overworld/ember-world.yml on current world layouts

Paper's own files are untouched. EmberMC never reads or writes paper-global.yml.

The rules

Every option is real. An option appears in the file only when something in the build reads it. Sections for the entity engine, Packet Guard and the adaptive engine arrive with the milestones that implement them. The one exception is marked as such (entities.optimization, read and shown today, applied from Milestone 4) so world files can be prepared ahead of it.

Every option is documented here, with its reload semantics. The YAML loader Paper ships writes a header comment per file but not per-key comments - Paper's own paper-global.yml is the same - so this page is the reference. Each option is either reload-safe (/ember reload applies it) or restart-only, and /ember reload tells you which values it applied and which need a restart.

Versioned. _version at the top of each file. When a key moves, a transformation migrates old files in code; a value you set is never silently dropped.

Presets are defaults, not locks. profile decides what an unset option means. Anything you set explicitly wins over the preset.

ember-global.yml

_version: 1

# VANILLA, BALANCED, PERFORMANCE or EXTREME (case-insensitive when read). Decides what unset options mean;
# anything set explicitly wins. Read by later milestones. Restart-only.
profile: BALANCED

console:
  # Print the EmberMC box at startup. Restart-only.
  banner: true
  # truecolor, indexed-256, indexed-16 or none. Panel consoles render truecolor;
  # a plain terminal showing garbage wants indexed-16 or none. Restart-only.
  color-level: TRUECOLOR

status:
  # Show "live heap after last GC" in /ember status. Used heap counts uncollected
  # garbage; live heap is the footprint. Reload-safe.
  show-live-heap: true

update-checker:
  # One line at startup naming the build. Never contacts the network. Reload-safe.
  startup-message: true

ember-world-defaults.yml and <world>/ember-world.yml

_version: 1

entities:
  # inherit (use the server profile), vanilla, balanced, performance or extreme.
  # NOT YET APPLIED: the entity engine arrives in Milestone 4. Read and shown in
  # /ember config today so world files can be prepared ahead of it.
  optimization: INHERIT

A world file starts empty apart from _version. Add only what that world changes:

# world_resource/dimensions/minecraft/overworld/ember-world.yml
_version: 1
entities:
  optimization: EXTREME

Entity tiers, profiler, adaptive engine, metrics

Added by Milestones 3, 4 and 9. All in ember-global.yml; all reload-safe unless marked.

entities:
  tiers:
    enabled: true              # split Paper's activation range into full ring + outer ring
    full-range-fraction: 0.0   # 0 = from profile (BALANCED 0.75, PERFORMANCE 0.5, EXTREME 0.4)
    reduced-interval: 0        # 0 = from profile (2, 2, 4): outer-ring entities tick fully every N ticks

profiler:
  spike-threshold-ms: 100            # a tick longer than this writes a report to ember-reports/
  spike-report-cooldown-seconds: 30
  keep-spike-reports: 50
  spike-reports-dir: ember-reports
  default-session-seconds: 60        # /ember profiler start with no duration

adaptive:
  enabled: true                # respond to load: light / moderate / aggressive
  light-above-ms: 35.0         # tick p95 (5 s) thresholds
  moderate-above-ms: 45.0
  aggressive-above-ms: 50.0
  exit-margin-ms: 5.0          # leave a level only this far below its entry threshold
  hold-up-seconds: 5           # sustained above before rising one level
  hold-down-seconds: 20        # sustained below before falling one level
  ceiling: aggressive          # highest level allowed

metrics:
  endpoint:
    enabled: false             # Prometheus text at http://<bind>:<port>/metrics. Restart-only.
    bind: 127.0.0.1
    port: 9464

The adaptive engine changes exactly one thing today: it scales the entity tiers' full ring (never below 25% of the range) and outer-ring interval (never above 10). Every level change is one console line with the p95 that caused it, and /ember status shows the current level.

Pathfinding, item and XP limits, chunks, memory

Added by Milestones 5, 6, 7 and 10. All in ember-global.yml, all reload-safe. Each has a full write-up under How it works.

entities:
  tiers:
    always-full: []            # entity type paths pinned to full ticks regardless of distance
                               # e.g. [villager, piglin] for a trading hall. Empty = zero cost.
  pathfinding:
    enabled: true              # stop mobs re-running A* against a target they cannot reach
    failures-before-backoff: 8 # consecutive failed searches to the same target before backing off
    backoff-ticks: 40          # how long the backoff lasts once armed
  item-limits:
    enabled: false             # cap dropped-item entities per loaded chunk (anti dupe-flood)
    max-per-chunk: 300
    sweep-seconds: 10
  xp-limits:
    enabled: false             # cap XP-orb entities per chunk by folding overflow into survivors
    max-per-chunk: 200         # no experience is ever lost, only entity count drops
    sweep-seconds: 10

chunks:
  retention-diagnostics: true  # /ember chunks shows what holds chunks loaded; warns on a leak
  warn-threshold: 400          # plugin-held chunks in one world before a rate-limited warning
  warn-cooldown-seconds: 300

memory:
  idle-trim:
    enabled: true              # hand idle heap back to the OS after the server is empty a while
    after-minutes: 5           # needs uncommit-friendly JVM flags to actually shrink; see the docs

security:
  packet-guard:
    plugin-message: { per-second: 20, burst: 60, max-bytes: 32768, action: throttle }

The adaptive engine (adaptive.* above) also tightens the pathfinding backoff on its own under sustained load, within bounded limits; at normal load it changes nothing.

Presets

Preset Intent
vanilla EmberMC systems present but passive: observe and report, change nothing about gameplay timing
balanced Production default. Optimisations no player can notice; protections on with generous limits
performance Larger activation ranges, longer inactive intervals, tighter limits. Test your farms
extreme Lobbies, minigames, resource worlds. Distant entities barely tick. Not for a main survival world

Commands

Command Permission Does
/ember config ember.command.config Active profile, console settings, file locations, each world's effective values
/ember reload ember.command.reload Re-reads all three kinds of file; reports what applied and what needs a restart