Changelog
0.6.0 (2026-09-21)
Section titled “0.6.0 (2026-09-21)”Features
Section titled “Features”- add versioned SQL migration catalog and history validation (db87b4a)
- apply PostgreSQL migrations with isolated DbUp runner (6162c53)
- persistence: simplify database config and entity registration (a7e9971)
- ship and document versioned database migration workflow (bd72582)
- validate migrations at startup and generate SQL drafts (c22019e)
Bug Fixes
Section titled “Bug Fixes”- generate third-party notices for migration runner (74530a2)
- preserve migration atomicity and align CLI defaults (c30636f)
Miscellaneous Chores
Section titled “Miscellaneous Chores”- release 0.6.0 (70dbb4d)
0.5.0 (2026-09-20)
Section titled “0.5.0 (2026-09-20)”⚠ BREAKING CHANGES
Section titled “⚠ BREAKING CHANGES”- persistence: replace binary storage with async PostgreSQL facades
Features
Section titled “Features”- api: provision certificates and simplify peer permissions (45ebc45)
- api: provision missing certificates on explicit opt-in (f913862)
- api: support wildcard operation permissions for trusted peers (9366017)
- docker: add login and two-realm Compose example (e2708cb)
- docker: add login and two-realm Compose example (4011906)
- persistence: add PostgreSQL schema foundation (cfc37a2)
- persistence: replace binary storage with async PostgreSQL facades (412e3b5)
- server: integrate PostgreSQL persistence lifecycle and schema commands (ac12088)
Bug Fixes
Section titled “Bug Fixes”- api: allow concurrent public certificate replacement on Windows (a2c91b5)
- docker: preserve PostgreSQL secret values (3aa5493)
- persistence: drain admitted captures before releasing save coordination (a17ceb8)
- persistence: isolate FreeSql entity mappings (9b8a04d)
- persistence: reject silently unmapped writable properties (b6c47c7)
- server: retain all terminal capture failures during shutdown (5300502)
Miscellaneous Chores
Section titled “Miscellaneous Chores”- release 0.5.0 (edc42a6)
0.4.1 (2026-09-20)
Section titled “0.4.1 (2026-09-20)”Features
Section titled “Features”- api: add opt-in server API configuration (ce4423c)
- api: host the configured internal API server (1bab556)
- api: start configured API listener with the server lifecycle (6672fa6)
- docs: add Starlight documentation and release publication (14987bd)
- docs: add the Starlight documentation website (3b903d5)
- docs: import existing guides and library readmes (b44dceb)
- network: restore standalone span serialization utilities (86bc49f)
- network: restore standalone span serialization utilities (14221a7)
- samples: add a plugin that registers a Lua module, a command and a metric provider (34b3e24)
- scripts: install the released server with one command on Linux (a271384)
Bug Fixes
Section titled “Bug Fixes”- api: reject unusable server certificates before startup (dd9b648)
- docs: preserve imported anchors and responsive images (9f4f7cd)
- docs: serve documentation from the configured custom domain (a519cb5)
- samples: reject undefined tones and keep host assemblies out of the bundle (20952f9)
- samples: report the metric under its local name so the diagnostics service accepts it (b248c25)
- scripts: keep the previous installation when the swap fails (45491fd)
- scripts: tell the truth when an install fails after the files are in place (ee6cded)
Miscellaneous Chores
Section titled “Miscellaneous Chores”- release 0.4.1 (0341165)
0.4.0 (2026-09-19)
Section titled “0.4.0 (2026-09-19)”⚠ BREAKING CHANGES
Section titled “⚠ BREAKING CHANGES”- packets: NetworkSession accepts and exposes INetworkConnection; ISessionService.GetOrCreate now accepts INetworkConnection. Recompile Server.Core consumers and plugins.
Features
Section titled “Features”- api: add a script that generates the private CA and leaf certificates (6ac4ccf)
- api: add authenticated internal request/reply channels (f5de84f)
- api: add versioned MessagePack framing (85b51ab)
- api: authenticate peers with mutual TLS and local policies (155caed)
- api: bound pending calls and outgoing work (0079e14)
- api: dispatch authorized requests with bounded execution (54b4e40)
- api: expose authenticated clients and servers with owned lifecycle (79ec6a2)
- api: merge internal request/reply channel into develop (f5de84f)
- api: register typed operations and freeze handler metadata (d3d2512)
- diagnostics: add AddMetricProvider container extension (97a9498)
- network: own bounded asynchronous connection setup (96583da)
- network: support configured outbound stream preparation (ddca33f)
- network: track role-local connections and owned cleanup (95e9824)
- persistence: add the AddPersistenceEntity registration (f5a87e2)
- persistence: let an entity declare its own collection (62fe55d)
- scripting: add module attributes, engine contracts and registration (3c220c0)
- scripting: add the engine, log and timer modules (1254614)
- scripting: add the Lua script engine service (00b07e8)
- scripting: add the Moongate.Scripting project on LuaCSharp 0.5.6 (1e5a126)
- scripting: bind module functions to Lua by attribute (1c10d51)
- scripting: cap the strings string.rep may build (ec34afc)
- scripting: expose module constants and enums to Lua (f58328f)
- scripting: generate editor definitions from the bound modules (6c47fa4)
- scripting: guard the loop thread and drive LuaCSharp synchronously (97f4c88)
- scripting: load script files and serve require from the scripts directory (79ff657)
- scripting: make the module binder public and document the package (84fa4b8)
- scripting: schedule coroutines on the timer wheel under an instruction budget (d43ab38)
- server: add a script metrics console command (b05035d)
- server: add flags-based server mode configuration (28e9af2)
- server: add flags-based server mode configuration (#4) (2302fb8)
- server: host the Lua script engine (56c4180)
- server: register typed API handlers through the container (6d72508)
Bug Fixes
Section titled “Bug Fixes”- api: report certificate script failures and clean up partial output (9e3eb84)
- api: retain admission until connection work completes (d700e4c)
- network: preserve the actual bound endpoint during drain (ee503f1)
- packets: distinguish requested closure from send failures (0fd415b)
- scripting: annotate enum parameters as enum or string in definitions.lua (789e6a4)
- scripting: annotate varargs as … and make definitions.lua robust to any constant (271d6a4)
- scripting: cancel script timers on shutdown and publish errors from the loop (80b3ad5)
- scripting: close the arithmetic bypass in the string cap and match Lua’s argument errors (960be94)
- scripting: close the sandbox (379a2d4)
- scripting: document the built-in modules and let a running coroutine own what it schedules (817d28e)
- scripting: follow links when containing script paths (7c283fd)
- scripting: give the logged print standard tostring semantics (860785a)
- scripting: import Interfaces.Internal in the engine service (a8a65d9)
- scripting: import Interfaces.Internal in the engine service (22614af)
- scripting: keep a failing reload or wait off the game loop’s fault path (c0b5b25)
- scripting: keep every coroutine failure inside the scheduler and scope the budget per unit (51b2fe1)
- scripting: keep one cancellation source per coroutine so the budget survives wait (e3700f0)
- scripting: let ValueTask.Result rethrow the original exception itself (1532d94)
- scripting: make the instruction budget survive an abort and cover pcall (281b162)
- scripting: name the member when a script constant getter throws (fe83b67)
- scripting: report out-of-range integers as Lua errors and document the binder (e94cc54)
- scripting: route Lua print through the server log (77a91ed)
- scripting: run the engine’s start and stop on the game loop thread (30bb64e)
- scripting: zero-pad control-character escapes in definitions.lua (fba7b33)
- server: validate the scripting section with the server config (0607e30)
Code Refactoring
Section titled “Code Refactoring”- packets: separate connection sends from game sessions (a07e1dc)
0.3.0 (2026-09-18)
Section titled “0.3.0 (2026-09-18)”Features
Section titled “Features”- core: add a packet hex formatter (d02d73d)
- core: read the assembly codename from metadata (abde51e)
- diagnostics: add typed snapshots and process metrics (80ae398)
- diagnostics: collect and publish immutable snapshots (54b8636)
- diagnostics: expose loop timer and session metrics (981504a)
- diagnostics: integrate configurable diagnostic service with bootstrap (c4f6b25)
- print the codename in the startup header, sourced from the Codename (a9da36e)
- register IUltimaDataService with UltimaDataService at priority -10 and (a9da36e)
- release: attach a SHA-256 checksum next to each release tarball. (948c746)
- server: add single-instance startup and the Ultima data service (a9da36e)
- server: write the log file as compact JSON (06395e3)
Bug Fixes
Section titled “Bug Fixes”- docker: copy Moongate.Ultima.csproj in the restore layer. The server has (948c746)
- docker: hold the server root at /data, created and owned by the runtime (6f682e2)
- docker: let the licence into the build context (01780ff)
- give UltimaConfig.UltimaPath a default instead of leaving it null. (a9da36e)
- tests: build the plugin fixtures in the requested configuration (abc6cca)
0.2.0 (2026-09-18)
Section titled “0.2.0 (2026-09-18)”Features
Section titled “Features”- config: load TOML server settings and create defaults (939246b)
- core: add entity primitives and expand utility coverage (0bb77bd)
- core: add runtime utilities and shared buffer infrastructure (e3434c2)
- core: add TOML serialization utilities (63731c3)
- core: default TOML property names to snake_case (e5ced0c)
- core: port geometry primitives from legacy Moongate (4256a4d)
- logging: log service startup and improve console layout (eac6b87)
- network: add bounded pending frame buffer (544faac)
- network: add opcode diagnostics and wire session events (035dc28)
- network: add standalone ping and login packets (0fe330a)
- network: add supported client features packet (a846be3)
- network: expose listener endpoints and scaffold network service (7faecf8)
- network: frame incoming Ultima Online packets (3e0e0fa)
- network: infer packet direction during registration (fdbb70e)
- network: port standalone TCP transport from Moonwell (d9e1f9b)
- network: request listener shutdown when network service stops (f863145)
- packets: add queued replies and initial packet handlers (349d0da)
- packets: log registered packet and handler counts at startup (0be9311)
- packets: register typed handlers and dispatch on the game loop (d51d704)
- persistence: add durable binary collection storage (f048f77)
- persistence: add saving all registered live entities (929dac3)
- persistence: add typed data access and ZLinq queries (103d407)
- persistence: add verified backup and restore (5823827)
- persistence: merge binary persistence into develop (13b88b4)
- persistence: separate world capture from durable writes (6ed72f6)
- plugins: add lifecycle event subscriptions (5cc00c3)
- server-core: add account and command enums with session account type (93990da)
- server-core: add command context and definition metadata (d70ed2d)
- server-core: add command executor contract and deferred registry (0c2063f)
- server: add bootstrap lifecycle and circular buffer coverage (d39f1c0)
- server: add command system service with source and account gates (837e604)
- server: add console host and Docker setup (0ffc583)
- server: add console input loop dispatching operator commands (f8a41ec)
- server: add dedicated game loop with bounded work queue (2ef60c5)
- server: add echo command and register the command system at startup (45b5715)
- server: add fluent bootstrap service registration (88faa8c)
- server: add pinned console prompt service with terminal seam (7c9996d)
- server: add plugins with versioned dependencies (d5fb2df)
- server: add service registration and single-file publishing (6313ba0)
- server: coordinate periodic and final world saves (7431d31)
- server: enable the interactive console prompt at startup (ef392ba)
- server: expose event bus service wrapper (54c2d73)
- server: integrate packet handling with TCP lifecycle (0b8179b)
- server: integrate persistence lifecycle (c9fe6b4)
- server: load plugin bundles before service startup (8203099)
- server: port timer wheel into the game loop (142221c)
- server: register directory configuration and refresh startup banner (d9b2f97)
- server: route serilog console output around the prompt row (4b54821)
- sessions: add separate network and game session models (29b1673)
- sessions: port session registry and register singleton service (3afd670)
- ultima: initialize asset library with SkiaSharp (00c185a)
Bug Fixes
Section titled “Bug Fixes”- ci: let each release asset build fail independently (c05fae0)
- ci: pin release-please to main and build assets from the tagged commit (06de8f8)
- ci: use release-please’s include-v-in-tag instead of tag-format (e2015a4)
- docker: include persistence in cached restore (55ff990)
- game-loop: describe the batch limit accurately in startup logs (7a84ea3)
- network: coordinate TCP listener lifecycle and cleanup (4d5d816)
- network: preserve send failures and drain connection resources (d68e8f3)
- network: reject admitted sends after logical closure (6d96037)
- network: reject empty client version frames (7cd11b7)
- network: reject whitespace versions before game-loop dispatch (876bbd9)
- persistence: close capture and disposal races (ac90bfa)
- persistence: preserve collection cleanup after owner shutdown (7dc2cfd)
- plugins: preserve metadata startup cleanup failures (6adcedd)
- plugins: publish lifecycle tasks before callback reentry (0fe5847)
- server: align persistence lifecycle namespaces (05afb42)
- server: force process termination when shutdown leaves it running (7f811cc)
- server: harden console prompt logging, input faults and row width (2ec598b)
- server: reject network startup after shutdown begins (c3e324b)
- server: reject zero-valued command source and document console authority (7e56727)
- server: stop the prompt writer retrying a failed console write (fb693c0)
- sessions: enforce terminal mutation precedence (3251161)
Performance Improvements
Section titled “Performance Improvements”- network: bound frame buffers and remove redundant receive copies (d839eec)
Reverts
Section titled “Reverts”- server: drop the forced-termination guard (186f55f)
