Files
factorio-clusterio/CHANGELOG.md
T

78 KiB

Changelog

Unreleased

Fixes

  • Removed incompatible Server Select and Discord Bridge releases from the installer's plugin choices so selecting all offered plugins no longer installs them. #1102

Version 2.0.2

Fixes

  • Fixed installation with selected plugins by relying on automatic plugin discovery, and ensured installer failures return a nonzero exit status. #1082, #1084
  • Fixed web plugin controllerConnectionEvent handlers receiving the connector's event data instead of the event name. #1083
  • Updated installation instructions to recommend latest Node.js LTS and corrected outdated mod management, CLI, plugin, and release documentation. #1086

Meta

  • Made player-auth login tests independent of wall-clock timing and added verification-token expiry coverage. #1087
  • Added Node.js 26 to the CI test matrix across all tested Factorio versions. #1088

Many thanks to the following for contributing to this release: @psihius, @bbassie

Version 2.0.1

Fixes

  • Removed obsolete development-branch warnings from controller, host and ctl startup. #1078
  • Removed the obsolete alpha label and development warning from the Clusterio Library mod title and description. #1079
  • Fixed Factorio mod release uploads to use valid multipart requests and files from the requested output directory, uploading variants in version order. #1080

Many thanks to the following for contributing to this release: @psihius

Version 2.0.0

Features

  • Mod packs now show informational notices for disabled recommended mods and available compatible updates. #949
  • Added host, server name, save copy and start options to the create instance dialog in the web UI. #405
  • Added InstanceSaveGameRequest and clusterioctl instance save-game to save the running game of an instance. #405
  • Added permissions to PluginDeclaration and a Permissions type registry so plugin permission names are checked at compile time. #987
  • Added Update All to the web interface and --all to the ctl update commands, updating the core package and all npm installed plugins in one npm call. #910
  • Added typed hook system for plugin registration. (#730)
  • Added plugin install <package> command to controller, host and ctl which installs a plugin from npm and adds it to the plugin list. #1008
  • Added a guard that prevents controller and host restart requests from unintentionally downgrading Clusterio. #950
  • Added option to load static assets from a separate URL from where the controller's web API is hosted at. #983
  • Added clusteriocontroller copy-static command to copy static web assets to a folder to ease hosting assets on a separate server. #983
  • Added Mark Restart Required to the host and controller pages and matching ctl commands, for plugins installed by other means than the install request. #1043
  • Added the RoleViewPageBeforePermissions web extension slot for plugin components above the permissions on the role page. #1045
  • Added a list of permission groups to the role page, highlighting groups with granted permissions. #1044
  • Added clusteriohost create-scenario to create a scenario with the Clusterio modules patched in for use outside of Clusterio. #1014
  • Plugins can declare a migrationEntrypoint to migrate the config fields and role permissions core stores for them. Configs track the plugin version they were last loaded with in a hidden <plugin>.version field. #1073

Fixes

  • Deprecation warning DEP0190 is no longer printed when installing. #851
  • Events sent to subscribers are no longer addressed to the request id of the request that created the subscription. #847
  • Factorio account token no longer written to the log when a mod download fails. #795
  • Failed downloads no longer leave a temporary file and an open file handle behind, which could shift the file names used by later downloads. #957
  • Requests that could not be forwarded to the next hop are no longer answered a second time when the link disconnects. #650
  • Events broadcast from an instance to all hosts are now delivered to every host instead of only the one running the instance. #575
  • Web interface now asks to be reloaded when the controller's plugins change, instead of continuing against plugins that are no longer loaded. #804
  • Plugin list no longer reports a plugin added since the page was opened as having failed to load. #729
  • Instance console no longer hides the Factorio server's replies to console commands, or Factorio's own errors, when filtering to game activity. #853
  • Allow player online autosave slots to be disabled while autosaves are enabled. #966
  • Plugin web bundles are now loaded relative to staticRoot instead of webRoot. #980
  • Fixed inventory_sync not preserving the personal roboport toggle, the equipment movement bonus toggle, game view settings such as alt mode, and toggleable mod shortcuts between instances. #898
  • Schema validation errors are now included when an InvalidMessage is logged from IPC and event handlers. #986
  • Fixed clusterioctl not being able to reference hosts, instances, mod packs and roles by an integer like name. #886
  • Fixed the web-only plugin template referencing a permission that was never defined. #987
  • Config files are no longer world readable by default. #1005
  • Fixed failed recipe notification names being duplicated on every upload from the same instance in inventory sync. #964
  • Instances refuse to start with a mod pack for a newer Factorio version than the instance runs, instead of Factorio silently loading default mod settings. #1006
  • Documented the config options missing from configuration.md, marked the internal ones and noted the validation rules. #985
  • Fixed concurrent saves of the same file racing on a shared temporary file. #1026
  • Fixed control connections leaving their log subscription and debug dump listeners attached after closing. #1027
  • Fixed the Load Scenario modal reading the wrong field for map settings. #1032
  • Fixed the controller exiting when a control message's permission check threw an unexpected error. #1033
  • Fixed the host exiting on server log lines that look like actions but do not match the expected format. #1034
  • Fixed the controller crashing when a control connection with the WebSocket debug dump active was resumed. #1035
  • Fixed deleted users keeping their permissions on any open connection until they disconnected. #1030
  • Restored pagination on the instance save list. #967
  • Mod dependency resolution now only picks releases made for the mod pack's Factorio version. #965
  • Inventory sync no longer uploads an empty inventory over the stored one after a failed download. #912
  • Inventory sync now releases players who leave while using a temporary inventory, instead of showing them as busy until the instance stops. #975
  • Fixed reading map exchange strings from Factorio 2.1.13 and later, which broke instance load-scenario --map-exchange-string on current Factorio. #977
  • Fixed instances getting stuck on a host after a failed assign, and instance create requests no longer accept instance.assigned_host. #1029
  • Fixed the host exiting when an instance's whitelist or server settings config changed while it was starting, or when tags contained non-string values. #1028
  • Fixed a host being able to modify the controller's stored save list for, or forge log messages attributed to, instances assigned to other hosts. #1036
  • Fixed a stop request or RCON command hanging when the Factorio process exited before its RCON connection was established. #1031
  • Fixed core plugins needlessly installing the web_ui, controller, host and ctl packages. #1021
  • Installing a plugin on a host or the controller now marks it as needing a restart. #1042
  • Fixed plugin manifest path resolution when loading web assets. #1046
  • A plugin whose web build is expected but missing is reported again: Controller.loadJsonObject(path, true) throws on a missing file instead of returning {}, and a malformed JSON file always throws. #1046
  • Preserve full configuration field names when using the CLI config editor. #796
  • Plugin metrics hook handlers may return nothing. #1052
  • Fixed save names given when starting an instance or creating a save not being checked, allowing files outside the instance directory to be written or modified. #1053
  • Fixed access tokens from request headers being written to the controller and cluster logs. #1054
  • Fixed subscriptions and log following continuing after the user lost permission for them. #1056
  • Fixed web interface data staying marked as up to date after the user lost permission to view it, and not loading after permission was granted. #1058
  • Fixed ctl config edit showing fields that cannot be edited and leaving out field descriptions. #1051
  • Fixed the reason an instance failed to start being logged as "undefined". #1065
  • Fixed subspace inventory combinators missing items after instance startup. #1069
  • Fixed the controller crashing when a WebSocket client sent an invalid frame before completing the handshake. #1063
  • Fixed an instance reusing a stored game port that another process holds, which made it fail to start until the port was freed. #1065
  • Fixed credentials in request query parameters, such as OAuth codes, being written to the controller's HTTP log. #1074
  • Fixed plugin ctlConfigFields not being registered in the clusterioctl config. #1075
  • Fixed startup failures and plugin loading when installing Clusterio from published npm packages after the ES module migration. #1070

Changes

  • Global chat now filters server-specific GPS, blueprint, train, and train-stop rich-text tags before relaying messages between instances. #593
  • Instance console filter is now a labelled Game/Instance control instead of a single-label toggle, and Factorio's output in the log consoles is prefixed with [server] like every other log level. #853
  • Inventory sync sends only the recipe notifications that differ from the destination instance's state on download. #964
  • Log the source of responses received without a pending request, the peer of timed out connections and the number of messages resent on session resume. #1007
  • Plugins that are not expected to have a web build are no longer shown with an error in the plugins page. #1004
  • Plugins should now return a function to register handlers via hooks. (#730)
  • Plugin templates from @clusterio/create use entrypoint functions and hooks. (#730)
  • Improved typing for plugin APIs and webui extension points. (#730)
  • Plugin hooks run concurrently instead of one plugin at a time. (#730)
  • Access tokens are also accepted as an Authorization: Bearer header on HTTP API endpoints. #1009
  • plugin install and plugin add with a package name now check that they are run from a Clusterio installation directory. #1008
  • Bumped pnpm to 12, the GitHub Actions used by CI to their current majors, and the CI Factorio version to 2.1.17. #1022
  • Bumped dependencies, including eslint 10, yargs 18, chalk 6, @types/express 5 and @types/node 24. #1023
  • Plugin discovery now traverses dependencies only after confirming the parent package is a Clusterio plugin. #963
  • Converted the project to using ES Modules. #984
  • Converted the bundled plugins to entrypoint functions. #1052
  • Added controller.max_subscription_filters config to limit the number of filters a connection can subscribe with for one event. #1055
  • Added controller.max_send_buffer_size config to limit how much the controller buffers for a connection that does not acknowledge messages. #1057
  • Added links to the ExpCluster and Chat Relay community plugins in the README. #1062

Breaking Changes

  • staticRoot in the web interface now includes the static/ prefix. Plugins that fetch assets with ${staticRoot}static/... should drop the static/ part. #980
  • checkPermission and the web UI hasPermission helpers take PermissionName; TypeScript plugins must augment the Permissions interface. #987
  • Replaced plugins map with loadedPlugins set across core classes (except WebUi). (#730)
  • The /metrics endpoint requires a user token with the new core.controller.metrics permission. Concurrent scrapes share a single gather from the hosts. #1009
  • Config files now have to be explicitly created. Use the --create-config flag to get the old behaviour of creating it if missing. #548
  • Renamed clusterioctl's config-control subcommand to config. #1039
  • Renamed clusterioctl's main class from Control to Ctl. #1039
  • Renamed clusterioctl's config entries from control.[name] to ctl.[name]. #1039
  • Plugin entrypoints must now specify the full filename including the .js extension. #984
  • Renamed the inventory_sync plugin to player_sync, published as @clusterio/plugin-player_sync. Config fields, the inventory view permission, the controller database file and save data are migrated on load. Uninstall @clusterio/plugin-inventory_sync before installing the new package. #1072

Meta

  • Added a NO_EXTERNAL_TEST flag to skip tests that use external APIs. #976
  • Added a CI check that the controller and host stay compatible with the latest published release. #978
  • Added a Lua lint CI job using emmylua_check. #979
  • Added a plugin migration guide for 2.0 and documented that minor versions may contain breaking changes for the plugin API. #1050

Many thanks to the following for contributing to this release: @bbassie, @lntutor, @ColumbusLabs, @floze-the-genius, @Cooldude2606, @solarcloud7, @Hornwitser, @ILLISIS, @Danielv123, @PHIDIAS0303

Version 2.0.0-alpha.27

Features

  • Added a cluster overview landing page. #928
  • Remember the instance console chat/log toggle. #932
  • Show the public address on the instance details page. #934
  • Navigation links can now be opened in a new tab. #929
  • Instances can target a Factorio release channel (e.g. stable or experimental) as their version, resolved from factorio.com/api/latest-releases. #937
  • The instance console in the Web UI can be resized by dragging its bottom edge, and the chosen height is remembered across page reloads. #938
  • Tables now remember their sort and filters in the URL. #927
  • Display Factorio server version in login server list. #906
  • Add "Connect via Steam" button to login server list. #915

Fixes

  • Silenced two Ant Design console warnings in the Web UI: the deprecated Modal destroyOnClose prop, and a duplicate-value warning from the instance version selector. #940
  • Surface the mod portal's own error when downloading mods for an unsupported Factorio version. #941
  • Instances always create their config file on assignment preventing duplicate folder creation. #945

Changes

  • Reworked the site layout into a fixed sidebar with a top bar. #924
  • The builtin "recycler" mod is now included correctly as builtin. #925
  • Mod info.json versions (a mod's version and its factorio_version) are now parsed leniently, matching how the game reads them, instead of being validated against a fixed list of Factorio versions. #941
  • SubscriptionFilter now directly extends Set. #942
  • EventSubscriber now exposes network errors, include permission errors. #942
  • Quick bar syncing now supports quality filters. #944
  • Added support for recommended mod dependencies. #946

Meta

  • Node 20 is no longer officially supported as it went EoL in March 2026. Please update to v22 or v24. #943

Many thanks to the following for contributing to this release: @bbassie @Cooldude2606

Version 2.0.0-alpha.26

Features

  • Added filter state to EventSubscriber allowing plugings to more easilly filter events. #913
  • Added replace subscription action allowing filter state to be fully replaced with a single request. #913
  • Added ValueSubscriber and MapSubscriber as subclasses of EventSubscriber. #913
  • Added changelog viewer accessible from the version number in the web interface. #907
  • Added about popup to user menu containing support links, build, clusterio, and debug info. #914
  • Added user status filtering (admin, whitelisted, banned) to the users table. #905
  • Added instance selector to users page to scope user stats by instance. #905

Fixes

  • Online user table on instance page now correctly defaults to online only filter. #909
  • Fixed popup not opening when pressing kill within the instance control button. #859
  • Fix division by zero in CPU usage calculation. #916
  • Fixed permissions list not including grantByDefault in the json representation. #913
  • Fixed subscription resources being synced = false if the remote data was empty. #913
  • Fix incorrect use of path.parse within create template for plugins. #919
  • Fixed active filter icon behaviour in user search using empty string. #917

Changes

  • Player auth now uses a scroll pane for listing instance names. #909
  • subscriptionUpdate now fires for all subscription requests rather than just added subscriptions. #913
  • Unified instance and global user table columns for consistent behaviour. #917
  • Improved loading states for tables and inputs using synced state. #917
  • Refactored username rendering into a reusable component. #917

Breaking Changes

  • Renamed lib.Address.index to requestIndex and added addressIndex. #913
  • EventSubscriber no longer includes a values map, use MapSubscriber instead. #913

Meta

  • Version dependencies now use ^ which enables updates to be applied one package at a time. #803
  • Updated change log creation to include new lines and user contributions. #909

Many thanks to the following for contributing to this release: @Cooldude2606

Version 2.0.0-alpha.25

Features

  • Added double interrupt logic to ctl to force immediate exit. #887
  • Allow selection of factorio versions not listed on the Wube website for instances and mod packs. #867

Fixes

  • Fix the webui being unable to set host config values and that no error was displayed. #891
  • Fix instance config not updating on changes being applied. #901
  • Incorrect acccessing of player inventory during crafting queue serialisation when in remote view. #892
  • Use physical location and controller for syncing player to prevent teleporting with remote view. #894
  • Fixed player exiting space platform hub on sync and other remote view edge cases. #894

Changes

  • Config validation errors are no longer logged when raised during an request handler. #888
  • Updated role permission editor to use grouped layout with search and improved formatting. #902

Breaking Changes

  • Removed obsolete functionality to download headless server in the installer. #890

Many thanks to the following for contributing to this release:
@Cooldude2606 @Daniel @Hornwitser

Version 2.0.0-alpha.24

Features

  • Added FactorioIcon component for showing icons from the game in the web UI. #875
  • Added useDefaultModPack hook to the web UI. #875
  • Added types for the exported metadata for mod packs. #526
  • Added config value validation beyond simple type checks. #856
  • Added config staging to allow setting many values at once. #856
  • Added a warning when attempting to set player autosave slots lower than autosave slots. #855
  • Added controller.authSecret as the type of config field controller.auth_secret was inconsistent. #856
  • Added support for the node: prefix in import statements in web UI code. #881
  • Added config validation to load plugin to error when save patching or script commands are disabled #884

Fixes

  • Fixed host printing a deprecation warning on startup. #855
  • Fixed exported prototype metadata missing localised_name. #875
  • Fixed headless download option in installer failing with TypeError: callback is not a function. #860
  • Fixed controller crashing if a host attempted to download a mod that had been deleted from the controller's filesystem while the controller was running. #860

Changes

  • Moved /icon-reference to /mods/mod-packs/:id/icon-reference and linked it from the mod pack page. #875
  • Made the useAccount, useModPacks, useMods, useRoles, useSaves, useSystems, useUsers and related hooks in the web UI available to plugins. #875
  • Exported prototypes are now based on the defines.prototypes mapping from the game. #875
  • Removed usage of fs-extra. #860

Breaking Changes

  • Removed useExportManifest from the web UI. Use .exportManifest on a mod pack from one of the useModPack hooks instead. #875
  • Replaced the 8 useTypeMetadata hooks in the web UI such as useItemMetadata with useExportPrototypeMetadata. #875
  • .item-name css classes are no longer created in the web UI, and will not render icons from the game. Use the FactorioIcon component instead and pass it a prototype from useExportPrototypeMetadata. #875
  • Renamed useLocale hook in web UI to useExportLocale which now requires the mod pack to load the exported locale from as an argument. #875
  • Fluids are no longer merged with items in the exported prototype metadata for mod packs. #875

Meta

  • Changelog entries are now parsed with a script from pull request descriptions. #871

Many thanks to the following for contributing to this release:
@Cooldude2606 @Hornwitser

Version 2.0.0-alpha.23

Major Features

  • Added automatic headless download and update on linux. #330
  • Added recipe notification sync to inventory sync. #506

Features

  • Added config lock files to prevent process duplication. #815
  • Added process and system start times to system metrics. #826
  • Added icons to status tags for host and instances. #827
  • Extended export-data to produce icons for recipes, signals, technologies, planets, qualities and entities. #838
  • Added Icon Reference page to web interface at /icon-reference for browsing all exported icons. #838
  • Added visual flash to RCON result box to confirm command execution, even when the output is identical to the previous result. #793

Changes

  • Login screen now displays the cluster name. #818
  • Instance versions can now be set using Major.Minor without specifying a patch version. #820
  • Versions for factorio and mod packs can now be selected using a drop down menu. #820
  • The controller will now refuse to start if no users were loaded from file. #814
  • Improved wording and display of the generate host token modal. #828
  • Installations where multiple conflicting clusterio/lib packages have been installed will now fail with an error #863.
  • Export completion now logs per-category icon counts. #838

Fixes

  • Removed debug log statement from equipment grid serialization. #807
  • Fix that the documentation had a dead link to details of the message passing protocol #812
  • Fixed case where achievements were not disabled. #817
  • Fix headless download on linux install. #816
  • Fix option --no-download-headless being ignored. #816
  • Fixed action buttons overflowing on narrow screens across the web interface. #810
  • Fixed player logistics failing to load on servers without unlocked logistics networks. #806
  • Fixed mod dependency parser breaking with inconsistent spaces. #834
  • No longer attempts to sync inventory in single player. #835
  • Fixed tests failing when the configured factorio_directory contains stuff other than Factorio installs #540.
  • Always create a whitelist file so it can be watched for changes. #865
  • Added missing await statements which could cause an instance to start with an outdated admin/ban/whitelist. #869
  • Fixed metrics breaking when labels contain comma or equal signs #861
  • Fixed Host page show repeated errors when viewing an offline local host #848
  • Fixed bad mod paths in icon specifications crashing the export. #841
  • Fixed prototypes with no icon data causing errors during export. #841

Breaking Changes

  • Custom permission methods should use IUser rather than IControllerUser #837
  • controller.userManager has been refactored, see PR for details. #837
  • controller.instances has been refactored, see PR for details. #837
  • User/Instance/HostInfo renamed to User/Instance/HostRecord #837
  • Removed host.tls_ca and control.tls_ca config options, see section on self signed certificates for the replacement for this option #857

Many thanks to the following for contributing to this release:
@Cooldude2606 @Daniel @Double @Hornwitser @Ryan Walker

Version 2.0.0-alpha.22

Major Features

  • Added a download dependencies button which downloads missing dependencies. #726
  • Added an update mod button which downloads the latest compatible version of a mod. #725

Features

  • Added online player list to instance details page. #666
  • Added ability to restart instances as a single action. #779
  • Added ability to exclude instances from the 'Start all' web UI button. #451
  • Added plugin update detection for restart required #759
  • Added detection for mismatched mod and mod pack factorio version. #727
  • Added detection for dependency issues such as incompatible or wrong version. #727
  • Added a quick fix button for resolving detected dependency issues. #801

Changes

  • Restart host / controller is now the default action with stop moved to a dropdown. #780
  • Restart host / controller no longer shows unless it is enabled for that machine. #780
  • Plugin templates no longer depend on a dev install of Clusterio. #786
  • Better error message for when a plugin is missing an index file. #799
  • ModStore.downloadMods no longer checks if the mod is already downloaded. [#801](https://github.com/clusterio/clusterio/issues/801
  • Mod version for buildins will always be fully qualified, matching the requirement enforced on other mods. #801)
  • Subscriptions can now be filtered. #788

Fixes

  • Fixed the missing space between action buttons on the users and hosts list. #780
  • Fixed "rendered more hooks" error when refreshing hosts page. #769
  • Fixed inventory combinator time signal not always updating #610
  • Renamed templates for .gitignore and .npmignore that caused create --plugin-template to fail. #800
  • Fixed npm update button failing to apply update and restart.

Breaking changes

  • ModPortalDownloadRequest now requires an array of mod version pairs rather than a single mod name and version. #801
  • Version strings (e.g. 1.0, 1.0.0) now have stricter typing and validation, passing unchecked strings to functions will error. #801

Many thanks to the following for contributing to this release:
@Cooldude2606 @Danielv123 @Hornwitser

Version 2.0.0-alpha.21

Major Features

  • Added import, export, and restore of user lists (bans / admins / whitelist / combined). #717
  • Added remote update for core packages and third party plugins. #761
  • Added config cloning on instance creation. #720

Features

  • Added social links and instructions to error page. #742
  • Added button to download control config. #740
  • Added server action filter (aka "chat filter") to instance log in web ui. #744
  • Added factorio.console_logging to enable dedicated console log file for servers. #748
  • Added a recovery mode to host and controller accessible as an option on the run command. #752
  • Added username search to the users list. #751
  • Added log level filtering to the web ui. #745
  • Added pending update detection for host and controller. #758
  • Added restart required indicator for host and controller. #758
  • Added version mismatch indicator in host list. #758
  • Added host plugin list command to crl where previously only controller plugin list existed. #760
  • Added optional feature which allows new plugins to be installed remotely.
  • Added bidirectional whitelist syncing. #716
  • Added support for v2 map exchange strings. #700

Fixes

  • Fixed handling of zip files with multiple top-level folders. #739
  • Fixed looping between instances of ban and admin sync events. #736
  • Fixed quality being stripped from power armour equipment when moving between servers #753
  • Resolved webpack type export warnings #750
  • Reduce page load time on users list by enabling pagination. #718
  • Corrected stack trace and enabled source mapping during bootstrap. #764
  • Fixed map gen settings using the incorrect name for cliff settings following exchange string decode.

Meta

  • Silent testing is now truly silent. #764
  • Node 18 has reached end of life and is no longer maintained, we no longer guarantee support for it.
  • CI testing now runs on node 20 & 22 as well as factorio 1.1.110 & 2.0.47.

Many thanks to the following for contributing to this release:
@Cooldude2606 @Danielv123 @Hornwitser

Version 2.0.0-alpha.20

Features

  • Update subspace storage to 2.0 and space age. #733
  • A fresh install of Clusterio will include default mod packs. #719

Fixes

  • Fix crash when leaving a server without a logistic requester point #731
  • Use floor instead of round to prevent "1 minute and 60 seconds" being shown #723
  • Fixed production statistics overwriting consumption statistics and vise versa #734
  • Hot patch to add the updated 2.0.29 control.lua freeplay hash to know scenarios. commit

Meta

  • We have now introduced a new decisions log to aid tracking all the technical and design decisions we make and their reasons. #714

Many thanks to the following for contributing to this release:
@Cooldude2606 @Danielv123 @psihius

Version 2.0.0-alpha.19

Major Features

  • Added support for 2.0 builtin mods during mod pack creation. #684
  • Added basic 2.0 support to clusterio lua api and 1st party plugins. #685

Features

  • Added Datastore and Datastore Provider classes to the library to support savable Maps. #629
  • Added clean script to speed up publishing and debugging of build steps. #640
  • Added sub-tile option on plugin page headers. #642
  • Greatly improved plugin and module template generation. #641
  • Duplicate host connections from the same address will kill the older host process. #647
  • Controller will refuse duplicate host connections from different addresses. #647
  • Monorepos are now supported for external plugins. #654
  • Changed default role selection to be a dropdown menu rather than id. #664
  • Added credential option to config entries to allow writing sensitive data that can't be read back remotely.
  • Allow hidden and readonly graphical representations of config values. #665
  • Added locale exporting for all builtin mods, not just for the base mod. #684
  • Added option for silent testing which only shows the results, can be ran using pnpm silent-test #680
  • Added prompt for http port on installation of Clusterio. #564
  • Added drag and drop overlay to upload button on mods page and save table on instance page. #591
  • Automatically add plugins from ./plugins, ./external_plugins and installed npm modules. #692
  • compat.table_to_json and compat.json_to_table supported in all stages in pre 2.0 #687
  • Add "connect to server" button to web interface, launches with steam api. #608
  • Add space platform name mapping to space platform statistics. #706
  • Track space platform speed metric clusterio_statistics_exporter_platform_speed. #706
  • Track space platform weight metric clusterio_statistics_exporter_platform_weight. #706
  • Added bidirectional sync to admin and ban list. #709

Fixes

  • Fixed IPC errors reporting undefined when no stack trace was present. #624
  • Fixed loopback routing for instances reporting the wrong error message. #625
  • Fixed docs linking to non-existing js files after ts migration. #633
  • Fixed CI workflows using deprecated version of nodejs. #637
  • Fixed linux only tests to run on windows. #661
  • Fixed log events being sent from a host over an invalid websocket. #639
  • Fixed spaces passed in arguments to the installer causing it to break. #620
  • Fixed numeric admin name breaking login. #536
  • Fixed issues with subscriptions which prevented them from working on instances or generic events. #655.
  • Fixed unreliable datastore tests. #662.
  • Fixed 2.0 version extraction from linux headless. downloaded during installation of clusterio. #671
  • Fixed invalid transient state during server start. #676
  • Fixed host user sync to instances after reconnecting to the. controller. #678
  • Fixed WebUI adding and displaying the wrong base mod version. #684
  • Fixed WebUI inconsistent pattern matching for factorio version. #684
  • Fixed safeOutputFile not being atomic because of a missing path separator. #659
  • Fixed built-in mods showing as missing in the WebUI. #581
  • Fixed dirty flag not being set when only the config of an instance is updated. #675
  • Fixed incorrect command being used to remove players from the whitelist. #679
  • Fixed CI following undocumented breaking change from downstream dependency. #683
  • Fixed instance crash when missing saves folder. #698
  • Fixed statistics exporter not working on newer versions of windows 11 due to wmic deprecation. #707

Changes

  • Added prompt for the HTTP port to host the controller to the installer. #619
  • Added tests for sendEvent and sendRequest throwing the correct error messages. #638
  • Updated all web ui pages to use correct page header component. #643
  • Bumped Typescript version to 5.5 and implemented ${configDir} in base configs for "outDir". #648.
  • Added factorio.executable_path option which allows overriding the default path to the Factorio executable run.
  • Added instance version display. #573
  • Added factorio.shutdown_timeout config to set the time the host will wait for a Factorio server to shut down befor killing it.
  • Changed shutdown logic to prefer sending a /quit command via RCON instead of using diverging logic on Windows and Linux.
  • Added controller.factorio_username and controller.factorio_token config to set Factorio credentials used for the whole cluster.
  • Added controller.share_factorio_credential_with_hosts config to optionally require hosts to provide their own credentials.
  • Added host.factorio_username and host.factorio_token config to set Factorio credentials used on a given host.
  • Changed instance.rcon_password config to be a credential field that can not be read by the control interface.
  • Changed host.id instance.id and instance.assign_host config to be hidden fields that can not be seen on the web ui.
  • Updated display name and description of controller.external_address to avoid confusion. #674
  • Renamed config value controller.external_address to controller.public_url, migrations are applied automatically.
  • String config values with whitelisted values (enum) now display as a selection dropdown. #701
  • Existing selection dropdowns now support search filtering. #701
  • Added surface label to clusterio_statistics_exporter_instance_force_flow_statistics. #691
  • Compat lib now supports versions from 0.17 to 2.0 #711
  • Add bidirectional sync to admin and ban list. #709

Breaking Changes

  • Previously silent errors for controller.sendEvent now throw exceptions #625.
  • @clusterio/controller export InstanceInfo has added factorioVersion parameter.
  • Argument order for Config.canAccess changed to require an access mode passed as the second argument.
  • Instances can now have factorio.enable_script_commands disabled which will throw an error when any script command is used over rcon. #681.
  • User IDs are now case insensitive, duplicate users will be automatically merged with a backup created. #682
  • Plugins now require the keyword "clusterio-plugin" in package.json to be automatically loaded #692

Many thanks to the following for contributing to this release:
@CCpersonguy @Cooldude2606 @Danielv123 @Hornwitser @Laar @psihius

Version 2.0.0-alpha.18

Features

  • Added logging of HTTP requests and errors on the controller #556.
  • Added caching of data parsed from mods to speed up startup time #606.
  • Added command to installer to generate the code for making a new plugin #570.

Changes

  • Fixed Inventory Sync reporting a negative database size #598.
  • Fixed plugin events being invoked while a host connection was in an invalid state.
  • Suppresed bogus warning about event listener leak in the browser's console #600.
  • Fixed installer breaking on Windows after Node.js released a security fix #614.
  • During a data export the mod settings in mod packs will now be corrected to the type of the settings prototype if the type is incorrect.
  • Fixed missing color setting causing the Mod Pack view in the Web UI to show an error #609.

Many thanks to the following for contributing to this release:
@Cooldude2606 @Danielv123 @Hornwitser

Version 2.0.0-alpha.17

Features

  • Made the host an instance is assigned to link to the host page for that host in the Web UI #587.
  • Added pagination to the saves list.

Changes

  • Fixed an unhandled error in Subspace Storage crashing the host.
  • Fixed an unhandled rejection in disconnect logic crashing the host.
  • Fixed instance screen in Web UI not updating when an instance was reassigned.
  • Fixed an error thrown in the rendering of one page in the Web UI causing all pages to become inaccessible.
  • Fixed Web UI not showing instance saves when the permission to list and subscribe the saves is granted but the user is not a cluster admin.
  • Similarly fixed Web UI not showing the mod pack create, delete, list and host revoke token actions if the user is not a cluster admin.
  • Fixed Research Sync applying progress of a previous techology level to the level on the controller when it's the active research during instance startup.
  • Fixed data export with a mod using shorthand notation for the default value of a color-setting causing the ModPack data to be set to invalid data.
  • Fixed per user per instance player stats not being deleted when the instance it's for is deleted.
  • Fixed mods setting the item prototype icons property to an object mapping instead of an array breaking the data export.
  • Fixed a bad mod in the host's mods folder causing instance start to fail instead of the host re-downloading the mod.

Breaking Changes

  • Renamed the permission core.instance.save.list.subscribe to core.instance.save.subscribe.

Many thanks to the following for contributing to this release:
@Cooldude2606 @Danielv123 @Hornwitser

Version 2.0.0-alpha.16

Changes

  • Fixed message sequences not being renumbered when forwarded between links causing reconnects to send duplicated messages.

Version 2.0.0-alpha.15

Features

  • Added support for color-settings Mod settings #568.
  • Added clusterio_controller_pending_requests and clusterio_host_pending_requests metrics.

Changes

  • Fixed generated systemd file for clusteriohost not enabling source maps.
  • Fixed ctl not exporting types used for adding commands to ctl plugins.
  • Fixed controller only plugins throwing an error about missing a config field on startup out when added to hosts.
  • Fixed installer incorrectly claiming the options --factorio-dir and --no-download-headless conflicts with each other.
  • Fixed a memory leak on every request sent over the WebSocket.
  • Fixed assertion error on closing or invalidating a link with messages forwarded from a virtual link.
  • Fixed host hanging if stopped while an instance is in the process of creating a save during startup.
  • Fixed instance.auto_start option.
  • Fixed host log spammed with errors when plugins broadcast messages to instances with the plugin disabled.
  • Fixed properties of object config fields not being possible to remove.

Version 2.0.0-alpha.14

This release does not retain backwards compatibility with 2.0.0-alpha.13 meaning all parts of the cluster needs to updated at the same time. See the migration guide for how to update.

Major Features

  • Added mod management. Mods can be uploaded to the controller and included in mod packs that can be assigned to instances and run.
  • Added host port ranges which the instance ports will be automatically assigned a port from if factorio.game_port is not set.
  • Added system info such as CPU model, hostname and kernel along with basic metrics for CPU usage, memory usage and disk usage for the controller and hosts.
  • Added ability to remotely view and modify the configuration of hosts.

Features

  • Added logging of Clusterio version on startup
  • Added clusterio_controller_log_bytes metric counting the size of the log files on the controller.
  • Added warning logged when plugins on a connecting host does not match the ones installed on the controller.
  • Added ability to revoke user tokens.
  • Added restart required indicator to config fields in the Web UI.
  • Added ability to revoke host tokens.
  • Added support for plugins to run in the context of a host.
  • Added more feedback when the web UI and or its plugins fails to load.
  • Added autosaving of data held in memory on the controller such as configs, instances, users, mods to prevent large data loss on crashing.
  • Added system_info metric with kernel, instruction set, CPU Model, hostname and Node.js version of the controller.
  • Added clusterio_host_system_info metric with kernel, instruction set, CPU Model, hostname and Node.js version of hosts.
  • Added system_cpu_seconds_total, system_cpu_idle_seconds_total, system_memory_capacity_bytes, system_memory_available_bytes, system_disk_capacity_bytes, system_disk_available_bytes metrics for CPU, memory and disk usage on the controller.
  • Added clusterio_host_system_cpu_seconds_total, clusterio_host_system_cpu_idle_seconds_total, clusterio_host_system_memory_capacity_bytes, clusterio_host_system_memory_available_bytes, clusterio_host_system_disk_capacity_bytes, clusterio_host_system_disk_available_bytes metrics for CPU, memory and disk usage on hosts.
  • Added support for reading the client's IP address from the X-Forwarded-For header when the source address is in the controller.trusted_proxies config option.
  • Added field showing the IP address a host is connecting from.
  • Added per player statistic tracking when they were first seen joining a particular server.
  • Added ability to remotely restart and/or stop the controller and hosts.

Changes

  • Fixed filenames with extensions that are invalid on Windows such as "con.zip" not being treated as invalid.
  • Fixed generate host token modal not using a random id when the optional id field is unset.
  • Exported Factorio data is now tied to mod packs instead of being per cluster.
  • Fixed export failing if a mod uses a different root folder mod_version in its zip file.
  • Fixed sorting of user last seen column in the Web UI.
  • The list users permission is now granted by default to players.
  • Fixed incorrect handling of hosts and instance with an id of 0 causing them to not update properly.
  • Fixed unable to unassign instances in the Web UI.
  • Fixed host crashing if the Factorio server is not marked executable.
  • Fixed errors logged from instance not being attributed to the instance in certain situations.
  • Hosts no longer print messages from instances into their console.
  • Clusterio now treat unhandled Node.js errors and promise rejections as fatal and exit immediately.
  • Fixed a potential for data loss after a hard system crash due to fsync not being called on files written.
  • Fixed Factorio server crashing in the research_sync plugin when a mod enables a previously disabled technology and a player attempts to research it.
  • Fixed Factorio server crashing when the game starts with tick_paused = true
  • Removed migration of alpha 10's single file log format.
  • Log errors linking mods on Windows instead of preventing startup.
  • Added locale support for modules patched into to the game save.
  • Added support for defining a module_exports.lua file for modules patched into the game save.
  • Fixed controller logs being split on server's local time day boundary instead of UTC day boundary.
  • Fixed Unicode BOM in mod locale files breaking instance data export.
  • Added a warning to the server-setting.json that is automatically written to instance folders stating changes will be overwritten.
  • Changed save patching to use a .tmp.zip extension for the temporary file created instead of zip.tmp.
  • Fixed Inventory Sync wiping the player's inventory when logging out while in the Space Exploration remote view mode.
  • Fixed the public /api/plugins endponit leaking filesystem paths on the controller.
  • Refactored list subscriptions in the Web UI to cache and only fetch updated entries when navigating to previously seen list.
  • Added caching of save lists on the controller, enabling the saves of instances on offline hosts to still be seen.
  • Hosts in the assign instance dropdown is now sorted by name.
  • Added non_blocking_saving as one of the default settings added to factorio.settings on new instances.

Breaking Changes

  • Renamed usage of the terms master and slave to controller and host in all places they occur.
  • Mods located in sharedMods are no longer copied to instances' mods folder.
  • The instances' mods folder is now managed through mod packs, mods not part of the mod pack will be automatically deleted.
  • Removed ability to import sub packages like @clusterio/lib/link from.
  • Replaced clusterio_controller_http_hits_total metric with clusterio_controller_http_endpoint_duration_seconds.
  • Replaced clusterio_controller_last_query_log_duration_seconds metric with clusterio_controller_query_log_duration_seconds summary.
  • Reworked the network protocol to be simpler to work and reason with.
  • Bumped minimum supported Node.js version to v18.
  • Ported the codebase to TypeScript
  • Changed the config format stored on disk to be much simpler.

Contributors

Many thanks to the following for contributing code in this release:
@Hornwitser @Luciole0x @Cooldude2606 @Danielv123 @Reavershark @Laar @rstrom1763

Version 2.0.0

Major Features

  • Replaced Hotpatch with save patching. Removed the Hotpatch scenario and the depency on it for getting code into the game. Added a save patcher than runs before starting up Factorio that patches in lua modules based on the event_loader lib into the savegame. Regular freeplay games can now be used with Clusterio and will be compatible without having to convert them to Hotpatch.
  • Daemonized hosts. Hosts now have the ability to run multiple Factorio instances, starting and stopping them individually. To manage this the local command line interface has been replaced with a remote interface on the controller that can be accessed through the clusterioctl cli tool.
  • Rewritten the communication between hosts and the controller from scratch. The new system is based on a WebSocket connection between the hosts and the controller and provides efficient validated bi-directonal communication.
  • Rewritten the plugin system from scratch. Plugins now inherit from a base class and use the same WebSocket connection Clusterio uses to communicate.
  • New configuration system with support for initializing configs when needed, modifying config entries using built-in commands, and updating instance configuration remotely.
  • Packaged and uploaded to npm again, greatly simplifying distribution and installation of both Clusterio and plugins.
  • Added centralized logging for the cluster. All logs from both Clusterio and Factorio is stored in a shared log which can be inspected and queried.
  • Added remote save management with the ability to list, create, rename, copy, upload, download, transfer, delete and load saves for instances.

Features

  • Added export of pollution statitics.
  • Reconnection logic that esures no data is dropped talking to the controller provided the session can be resumed.
  • Added support for having multiple Factorio installs and selecting which version to use on a per instance basis.
  • Added config to specify which path the controller interface is accessed under, allowing it to be proxied behind web-server.
  • Added WebSocket usage statistics.
  • Added commands sent statistic.
  • Added Factorio server CPU and memory usage statistic.
  • Added Factorio autosave size statistic.
  • Added support for extracting locale and item icons from Factorio and mods.
  • Added integrated user management for controlling access and storing per player data.
  • Added synchronization of in-game adminlist, banlist and whitelist to Clusterio core. Previously this was handled by the playerManager plugin.
  • Added stripping of long paths in the Factorio server log.
  • Added option to configure maximum number of commands to send in parallel.
  • Added option to auto start instances on host startup.
  • Added metric mapping of host and instance ids to their names, allowing them to be displayed by name in queries that join with the mapping.
  • Added option to configure timeout for exported Prometheus metrics.
  • Added option to set address to bind HTTP(S) port to.
  • Added an overview of the installed plugins to the web interface.
  • Added clusterioctl command to list plugins on the controller.
  • Added Player Auth plugin for logging in to the web interface by proving the ability to log in to a server as a given user.
  • Added Node.js based installer to simplify setting up a cluster.

Changes

  • Added error handling during controller startup.
  • Factorio game and rcon port now defaults to a random port above 49151.
  • Removed unimplemented mods update command.
  • Fixed rcon password being generated with Math.random().
  • Added plugins directory to the views path. This makes it possible for plugins to render their own ejs views or pages in their own folders by using paths of the format "pluginName/path/to/page-or-view".
  • Replaced the per instance copy of the shared Factorio mods with symlinks. On Windows hard links are used instead due to the privileges requirements of symlinks.
  • Changed the per instance scenario folder to be linked instead of copied on instance creation.
  • Instance id is no longer derived from the rcon password, instead it's generated upon instance creation and stored in the instance config.
  • The game port, RCON port and RCON password instance config entries are are now null by default, indicating that a random one will be generated every time the instance is started.
  • Removed the broken client download command as this would download pre-releases.
  • Moved the item database and HTTP definitions for /api/place, /api/remove, /api/inventory, /api/inventoryAsObject and the web interface view for the storage page into the clusterioMod plugin. If you disable this plugin then these things will not be available.
  • Removed undocumented --port and --rcon-port arguments to client.
  • Removed undocumented FACTORIOPORT and RCONPORT enviroment variable handling in client.
  • Removed redundant call to /api/slaves in globalChat plugin.
  • Removed broken serverManager plugin.
  • Removed factorio_version from config. The version installed is auto detected and used instead.
  • Removed the playerManager specific command CLI tools/delete_player.js.
  • Creating an instance, assigning it to a host, creating a save for an instance and starting an instance is now four separate commands.
  • Removed oddball limits to hosts.json size.
  • Moved host specific and instance specific configuration into their own configuration files.
  • Removed unused binary option from plugin config.
  • Removed info and shout command from globalChat plugin - Removed mirrorAllChat and enableCrossServerShout configuration options for globalChat plugin.
  • Removed UPSdisplay plugin. UPS statistics is exported by the statistics exporter plugin.
  • Controller now defaults to hosting on https on port 8443.
  • Renamed client to slave.
  • Removed rotation of factorio-current.log files.

Breaking Changes

  • Removed lib/authenticate. Breaks playerManager.
  • The masterIP and masterPort config entries has been merged into masterURL. Breaks discordChat, playerManager, serverSelect, trainTeleports and clusterioModel.
  • Removed config management from the command line and the server manager.
  • Moved ejs templates into views folder and changed their extension to .ejs. Breaks playerManager.
  • Mods are no longer copied from the per instance instanceMods directory. If you need per instance mods you can now place them directly in the mods directory inside the instance folder.
  • Hotpatch scenarios and code loading is no longer compatible with Clusterio. Breaks playerManager, serverSelect, and tranTeleports.
  • Removed getLua and getCommand from lib/clusterTools. If you need to run more than the most trivial of code in commands use the save patcher and add in a remote interface.
  • Removed mod uploading and distributing from the HTTP interface. Breaks the old unmaintained and no longer needed factorioClusterioClient.
  • Removed the remoteCommands plugin and the old runCommand interface. Breaks playerManager and external tools sending commands.
  • Removed broken serverManager plugin.
  • Removed fields info, time, rconPort, rconPassword, serverPort, unique, mods, instanceName, playerCount, mac, and meta from the hosts in the host database.
  • Removed getInstanceName and lib/clusterTools. Breaks playerManager, and discordChat.
  • Removed the /api/rconPasswords, and /api/slaves endpoints. Breaks web interface, trainTeleports, and discordChat.
  • Removed the /api/getSlaveMeta and /api/editSlaveMeta endpoints. Breaks researchSync, and UPSdisplay.
  • Removed the hello event from the socket connection handshake. Breaks playerManager, trainTeleports, serverSelect, and discordChat
  • Changed the format of database/hosts.json.
  • Removed the output file subscription system. Breaks inventoryImports, playerManager, trainTeleports, serverSelect and researchSync.
  • Removed the factorioOutput hook from instance plugins. The onOutput hook provides parsed output instead.
  • Removed the onLoadFinish hook from master plugins.
  • Moved plugins from the sharedPlugins directory to plugins directory.
  • Implemented a new plugin system that replaces the old. Breaks all plugins.
  • Removed express metric http_request_duration_milliseconds metric.
  • Removed socket.io metrics socket_io_connected, socket_io_connect_total, socket_io_disconnect_total, socket_io_events_received_total, socket_io_events_sent_total, socket_io_recieve_bytes, and socket_io_transmit_bytes,
  • Removed clusterio_connected_instaces_gauge and added clusterio_master_connected_clients_count in its place.
  • Renamed clusterio_player_count_gauge to clusterio_statistics_exporter_instance_player_count
  • Removed clusterio_UPS_gauge and added clusterio_statistics_exporter_instance_game_ticks_total in its place.
  • Renamed clusterio_endpoint_hit_gauge to clusterio_http_enpoint_hits_total
  • Renamed clusterio_statistics_gauge to clusterio_statistics_exporter_instance_force_flows
  • Renamed clusterio_nn_dole_gauge to clusterio_subspace_storage_nn_dole_gauge.
  • Renamed clusterio_dole_factor_gauge to clusterio_subspace_storage_dole_factor_gauge.
  • Renamed clusterio_import_gauge to clusterio_subspace_storage_import_total.
  • Renamed clusterio_export_gauge to clusterio_subspace_storage_export_total.
  • Renamed clusterio_master_inventory_gauge to clusterio_subspace_storage_master_inventory.
  • Removed clusterioMod plugin specific config options logItemTransfers, disableFairItemDistribution useNeuralNetDoleDivider, autosaveInterval, and disableImportsOfEverythingExceptElectricity from the master config.
  • Removed msBetweenCommands config option. The RCON is instead limited to 5 concurrent commands.
  • Removed allowRemoteCommandExecution config option. Remote commands are always allowed with the move to controller managing hosts/instances.
  • Removed --databaseDirectory, --controllerPort, and --sslPort command line arguments from the controller.
  • Implemented a new config system that replaces the old. Breaks all plugins.
  • Removed usage of socket.io entirely in favor of a plain WebSocket connection.
  • Renamed clusterioMod plugin to subspace_storage.
  • Controller no longer creates secret-api-token.txt.
  • Removed automatic creation of self-signed TLS certificate.
  • Node.js versions below 12 are no longer supported.

Version 1.2.4

  • Removed broken remote combinator signaling.
  • Fixed research sync endlessly updating already researched technologies
  • Removed obsolete item/fluid statistics from clusterioMod
  • Removed per mod upload logging when config.uploadModsToMaster disabled
  • Fixed bcrypt failing to install on windows due to the new version not having Windows binaries.

Version 1.2.3

  • Disabled uploading mods to the master server by default as this is mostly just a waste of bandwidth with the mod portal being integrated into the game now.
  • Fixed researchSync breaking with heavily modded games due to the tech tree exceeding the default 100kb limit on JSON payloads.
  • Fixed the command inventoryImport sends referencing player instead of character, and trying to count the non-existant quick bar slots.
  • Fixed inventoryImport never receiving the script output after the default mode for reading script output changed to tail mode.
  • Fixed desync caused by the mods and loaded mods arrays in Hotpatch getting out of sync when plugins update their scenario mod code. To fix existing games you will need copy lib/scenarios/Hotpatch/hotpatch/mod-tools.lua over the existing mod-tools.lua in the save's hotpatch folder.
  • Updated the Windows install instructions.

Version 1.2.2

  • Fixed possible crash with modded technologies named the same as a built-in Object prototype property in researchSync.
  • Fixed progress of a current infinite tech carrying over to the next one when researching it and another node completes it in researchSync.
  • Fixed progress of a previous infinite tech from another node being applied to the current one in researchSync.
  • Fixed crash in researchSync when modded technologies are present only on some nodes.
  • Fixed install failing due to bcrypt version less than 3 not being supported on node v10.
  • Reordered install instructions to avoid problem with npm creating files owned by root in the home directory.
  • Swapped curl out with wget in the install instructions as the latter comes pre-installed on Ubuntu.

Breaking Changes

  • Node.js versions below 10 are no longer supported.

Version 1.2.1

  • Updated node-factorio-api to v0.3.8 to fix mod downloads randomly breaking (#229).
  • Fixed SIGINT being sent twice to Factorio server when interrupted by CTRL+C on Linux (#217).
  • Fixed package.json incorrectly reporting the license as ISC.

Breaking Changes

  • Added authentication to the socket.io server running on the master.