diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index aeacaf872f..cf166da500 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -34,7 +34,7 @@ env:
OPENRCT2_BUILD_SERVER: GitHub
OPENRCT2_ORG_TOKEN: ${{ secrets.OPENRCT2_ORG_TOKEN }}
BACKTRACE_IO_TOKEN: ${{ secrets.BACKTRACE_IO_TOKEN }}
- OPENRCT2_VERSION: 0.4.27
+ OPENRCT2_VERSION: 0.4.28
# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value
concurrency:
diff --git a/debian/changelog b/debian/changelog
index b34be1ca99..abbdfef2cd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,40 @@
+openrct2 (0.4.28-develop-1) unstable; urgency=medium
+
+ * Feature: [#25286] Footpath area dragging tool.
+ * Feature: [#25379] Add an option to the command line screenshot function to draw debug segment heights.
+ * Improved: [#21375] The `load_object` console command now allows loading JSON objects.
+ * Improved: [#25297] Paths on the ground in SV4/SC4 no longer block supports of the paths above.
+ * Improved: [#25349] ‘Recent Messages’ window can now be fully themed.
+ * Improved: [#25433] Colour dropdown now uses bigger images in Enlarged UI mode.
+ * Change: [#25089] Peep actions and animations that cause them to stop moving no longer trigger when they are on a level crossing.
+ * Change: [#25337] Placing track designs with scenery that is obstructed no longer disables all of the scenery.
+ * Fix: [#20198] Guest inventory from RCT1 base game saves is not imported.
+ * Fix: [#20486] Multiplayer desync when placing track designs without any scenery.
+ * Fix: [#22779, #25330] Incorrect queue paths in Nevermore Park and Six Flags Holland scenarios (bug in the original scenarios).
+ * Fix: [#24975] The Corkscrew and LIM Launched (original bug) roller coaster quarter loop tunnels are too high.
+ * Fix: [#25139] Steam locomotive and tram claxons can sound louder than normal when approaching crossings that span multiple tiles.
+ * Fix: [#25190] Inserting a block brake while a coaster is simulating will cause the simulation to behave strangely.
+ * Fix: [#25206] System file picker does not show up on the Steam Deck.
+ * Fix: [#25272] Text colour dropdown in the Banner window is too narrow, resulting in truncated labels.
+ * Fix: [#25299] The Mine Train Coaster left large helix draws incorrect sprites at certain angles (original bug).
+ * Fix: [#25328] Spiral Slide in Blackpool Pleasure Beach has its entrance and exit the wrong way round (bug in the original scenario).
+ * Fix: [#25342] The Go-Karts medium right gentle sloped turn does not have a tunnel at the end.
+ * Fix: [#25349] Items in Recent Messages are too narrow if there is no scrollbar visible.
+ * Fix: [#25350] The scrolling intro background switches colour halfway through (original bug).
+ * Fix: [#25350] When skipping the scrolling intro, the screen does not get cleared properly.
+ * Fix: [#25350] Scrolling intro cannot be skipped using a mouse click.
+ * Fix: [#25358] The Stand Up Roller Coaster left corkscrew does not block supports correctly.
+ * Fix: [#25363] The Mine Train Coaster flat-to-steep track pieces do not block all metal supports.
+ * Fix: [#25369] The Go-Karts medium turns and small flat and sloped turns do not block metal supports correctly.
+ * Fix: [#25370] The Hybrid Coaster diagonal brakes and block brakes do not block metal supports consistently.
+ * Fix: [#25371] The Wooden Roller Coaster small banked turns block too many metal supports.
+ * Fix: [#25378] The land tool sometimes allows land to be raised through a maze.
+ * Fix: [#25380] The Lay-down Roller Coaster left corkscrew supports are incorrect at one angle (original bug).
+ * Fix: [#25388] The Shortcut Keys window uses the wrong colours for separators, scrollbars and buttons.
+ * Fix: [#25401] Mazes can be built 2 units higher than their support limits.
+ * Fix: [#25404] Guests that have been removed with the remove all guests cheat will still be visible if they were sliding down the Spiral Slide.
+ * Fix: [#25410] Guest flags (e.g. tracking) not imported from RCT1.
+
openrct2 (0.4.27-develop-1) unstable; urgency=medium
* Feature: [#25218] `sprite exportobject` command, which allows extracting images from an object.
diff --git a/distribution/changelog.txt b/distribution/changelog.txt
index 19044b75f2..8759f51c3c 100644
--- a/distribution/changelog.txt
+++ b/distribution/changelog.txt
@@ -1,4 +1,4 @@
-0.4.28 (in development)
+0.4.28 (2025-11-01)
------------------------------------------------------------------------
- Feature: [#25286] Footpath area dragging tool.
- Feature: [#25379] Add an option to the command line screenshot function to draw debug segment heights.
diff --git a/distribution/linux/io.openrct2.openrct2.appdata.xml b/distribution/linux/io.openrct2.openrct2.appdata.xml
index 54be45fb0f..e4ab5d546d 100644
--- a/distribution/linux/io.openrct2.openrct2.appdata.xml
+++ b/distribution/linux/io.openrct2.openrct2.appdata.xml
@@ -456,6 +456,9 @@
none
+
+ https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.4.28
+
https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.4.27
diff --git a/distribution/macos/Info.plist b/distribution/macos/Info.plist
index 1a5be45ec1..e495144337 100644
--- a/distribution/macos/Info.plist
+++ b/distribution/macos/Info.plist
@@ -13,7 +13,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 0.4.27
+ 0.4.28
CFBundleSignature
ORCT
LSMinimumSystemVersion
diff --git a/readme.md b/readme.md
index b99239b3d2..c76927b55f 100644
--- a/readme.md
+++ b/readme.md
@@ -19,7 +19,7 @@
### Download
| Latest release | Latest development build |
|------------------------------------------------------------------------------------------------------------------------|--------------------------|
-| [](https://openrct2.io/download/release/latest) | [](https://openrct2.io/download/develop/latest) |
+| [](https://openrct2.io/download/release/latest) | [](https://openrct2.io/download/develop/latest) |
---
diff --git a/src/openrct2-android/app/build.gradle b/src/openrct2-android/app/build.gradle
index ae7943c19d..ca28484be8 100644
--- a/src/openrct2-android/app/build.gradle
+++ b/src/openrct2-android/app/build.gradle
@@ -21,8 +21,8 @@ android {
minSdkVersion 24
targetSdkVersion 36
- versionCode 14
- versionName '0.4.27'
+ versionCode 15
+ versionName '0.4.28'
externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_shared', '-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON'
diff --git a/src/openrct2/Version.h b/src/openrct2/Version.h
index f0abedd299..c60fff777c 100644
--- a/src/openrct2/Version.h
+++ b/src/openrct2/Version.h
@@ -12,7 +12,7 @@
#include
#define OPENRCT2_NAME "OpenRCT2"
-#define kOpenRCT2Version "0.4.27"
+#define kOpenRCT2Version "0.4.28"
#if defined(__amd64__) || defined(_M_AMD64)
#define OPENRCT2_ARCHITECTURE "x86-64"
diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp
index 084b362125..9e3f27a495 100644
--- a/src/openrct2/network/NetworkBase.cpp
+++ b/src/openrct2/network/NetworkBase.cpp
@@ -47,7 +47,7 @@
// It is used for making sure only compatible builds get connected, even within
// single OpenRCT2 version.
-constexpr uint8_t kStreamVersion = 6;
+constexpr uint8_t kStreamVersion = 0;
const std::string kStreamID = std::string(kOpenRCT2Version) + "-" + std::to_string(kStreamVersion);