Profile
Back to NewsBack
GitHub Trending 11 min
Reader Mode
Dyotson/ForzaHorizon1-ReImagined: Forza Horizon (Xbox 360) natively on PC, rebuilt around the modern Horizon experience: shared online free roam, leaderboards and rivals, 120/144 fps, and a self-hostable online server.

Dyotson/ForzaHorizon1-ReImagined: Forza Horizon (Xbox 360) natively on PC, rebuilt around the modern Horizon experience: shared online free roam, leaderboards and rivals, 120/144 fps, and a self-hostable online server.

8 hours ago

Forza Horizon 1: ReImagined logo

Forza Horizon 1: ReImagined

[!TIP]
The launcher is out: latest release
(Linux Flatpak for any distro, Windows installer; both experimental). It builds the game
from your own copy, no build steps needed. Announcement
· Website · Discord

The original 2012 Forza Horizon, running natively on PC and rebuilt around the modern Horizon experience: a shared online open world, leaderboards and rivals, high frame rates.

Forza Horizon 1: ReImagined takes Forza Horizon (Xbox 360) and brings it closer to what Horizon is today. The game runs natively on Linux and Windows, made by statically recompiling the original PowerPC executable to C++ with the ReXGlue SDK (the approach of RecompiledHaloReach), and on top of that the project focuses on:

  • Better gameplay: 60, 120 or 144 fps with the physics and race timing intact, native
controllers or keyboard and mouse, saves, Title Update 4 with Horizon Rally and the 1000 Club, and all 23 DLC packages.
  • Online free roam: the Horizon World playlist drops every online player into one
shared Colorado, where you drive, meet and race together; the goal is an MMO-like world where events fill up with players and the grid's free slots with AI (docs/online_vision.md).
  • Leaderboards and rivals: times, ghosts and bounties shared between players, Monthly
Rivals, car clubs and the Message Center, all live again.
  • Your own servers: Xbox LIVE and Turn 10's services are long gone, so the project
ships the Forza Live server (server/), self-hostable, with a public instance to join.

This repository contains no game code and no game data. You need your own copy of the game (the Games on Demand package or the disc 1 ISO of the base version, Title ID 4D5309C9). The recompiled C++ is generated from your copy on your machine; no binaries are published here.

Contents

- Playing online

Screenshots

Captured from the recompiled game running natively on Linux.

| | | |---|---| | !Free roam
Free roam | !Circuit race
Circuit race against 7 AI drivers | | !Prologue drive
Free roam, Colorado mountains | !Horizon World online
Horizon World online playlist: race lobby and races |

What works

  • The whole game, single player: the opening drive to the end of the festival has been
played through on ReImagined: free roam, festival events and races, showcase events, audio and saves. Saves from Xenia Canary can be continued (tools/play.sh --xenia).
  • Title Update 4 (the default), Horizon Rally and the 1000 Club: TU4 is built from your
own copy of the update (tools/apply_title_update.py, about 2 s). It adds the **Horizon Rally** expansion (with a Xenia save that has reached it: the Rally Heats and whole championships played to the end and saved; the co-driver is not heard yet) and the 1000 Club in the pause menu (signed in to the Forza Live server: its challenges earn medals that are kept with the career, and the server has the club's leaderboard). docs/dlc.md
  • All 23 DLC packages: every DLC car counts as installed, the Rally Expansion's 15 and
the 1000 Club's cars included (tools/install_dlc.py).
  • Keyboard and mouse or controller: mnk_mode = true plays the menus, free roam, a
race from sign-up to the finish, the pause menu, the map and photo mode with the keyboard (WASD, rebindable keys, a steering ramp and the mouse as the right stick). Throttle and brake are on/off. Any connected controller drives player 1. docs/playing.md
  • 60, 120 or 144 fps (frame_rate in forza.toml, any rate up to 240), with physics, the
race clock and online play keeping their timing. Measured on a Ryzen 7 7800X3D with a Radeon RX 9060 XT (docs/framerate.md, docs/perf.md):

| frame_rate | Free roam | Race, 7 AI cars (Clear Springs Circuit) | |---|---|---| | 60 | 59.9 fps | 59.6 fps | | 120 | 115.2 fps | 75.7 fps | | 144 | 111.5 fps | 70.1 fps |

The race is bound by the GPU emulation above 60; the game itself ran its main loop at the target rate in every run. 0 to 100 km/h takes 2.4 s at every rate.

  • Online (through the Forza Live server): sign-in as a Gold member, Find Game and races
with XP and credits, parties and custom games, a shared online free roam (the **Horizon World** playlist: 8 players per world, JUMP IN while a world runs, the next player placed with you when the host leaves), Playground Games modes (Infected, Cat & Mouse, King), leaderboards and Rivals (times, ghosts and bounties shared between players), car clubs and the club garage, and the Message Center (beaten-time alerts, gifts, club requests, invitations, news). Details in docs/online_vision.md and docs/title_services.md.
  • Title Update 4 online (tested with two players on a local server): Horizon World (one
player placed into the other's world), a 30 s event lobby filled with CPU drivers (2 humans and 6 CPU in an 8-car race) with scores, XP and credits, head-to-head challenges, the Rivals screen, the 1000 Club and host migration. Base-game and TU4 players are kept in separate rooms, since the two versions cannot play together (docs/dlc.md).
  • Your own server: the Forza Live server (server/, Python 3 standard library only, or
Docker) is self-hostable (docs/hosting.md), and there is a public instance to join.

Known issues

  • The Auction House exists on the server only; its screens were removed from the game, and
the storefront answers empty.
  • Throttle, brake and steering on the keyboard are all or nothing (the steering has a ramp),
and the game's menus have no pointer, so the mouse does nothing there (docs/playing.md).
  • Races with many AI cars are GPU-bound: 76 fps at a 120 fps target and 70 at 144 (60 holds).
  • Windows builds are cross-compiled from Linux and have only been tried under Proton, not
on Windows itself; the launcher's Windows path and installer have never run on Windows.
  • The launcher (v0.1.0) is experimental: tested end to end on Linux (Flatpak), not yet on Windows.
  • Title Update 4 and base-game players can't play together (separate rooms), and a profile
that ran on TU4 is refused by the base build.

Requirements

  • Linux x86-64 or Windows 10/11 64-bit, with a Vulkan 1.3 GPU, about 4 GB of free RAM (measured:
the game peaks at 1.1 GB from the main menu through free roam; the build peaks near 2 GB at -j4 and 3.2 GB at -j8, and is not run together with the game) and about 15 GB of disk (7.6 GB of extracted game files, the SDK 1.6 GB, the build tree about 1 GB, a downloaded compiler 1.1 GB). Windows: see below.
  • Your own copy of Forza Horizon, base version: the Games on Demand package
(4D5309C9/00007000/ plus .data/), or the retail disc 1 as an ISO (or a folder with its files; see docs/disc.md). Optional but recommended: the Title Update 4 package (4D5309C9/000B0000/, update 4000D145) for Horizon Rally and the 1000 Club.
  • For the manual build: Clang (tested with 23), CMake >= 3.25, Ninja, Python 3, Git,
OpenSSL (for tools/xex_image.py only). The launcher downloads what is missing. (nightly-20261002-bd833a2a).

Install with the launcher

This is the way to install. The launcher builds the game on your machine from your own files; nothing of the game is ever downloaded or shipped.

  1. Get the launcher from the latest release:
on Linux a Flatpak (works on Bazzite, SteamOS, Chimera, Ubuntu, Fedora and Arch; a .tar.gz is the alternative), on Windows an installer. The Flatpak is installed with flatpak install --user ForzaHorizon1-ReImagined-x86_64.flatpak (it pulls the freedesktop SDK runtime from Flathub by itself); install the compiler extension once with flatpak install flathub org.freedesktop.Sdk.Extension.llvm22//26.08 (0.5 GB; without it the launcher downloads a 2 GB compiler instead and tells you so).
  1. In Setup, point it at your Games on Demand package or your disc 1 ISO (it is
extracted and checked first), and optionally at your Title Update 4 package and DLC folder.
  1. Build: it generates the game from your copy and compiles it, downloading a compiler
and the SDK when you have none. Measured on 8 cores at -j4: a full build with Title Update 4 takes about 3.6 to 4.6 minutes, peaks near 2 GB of RAM and leaves about 15 GB on disk. It can be cancelled and resumed, and is repeated only when something changed.
  1. Play. Every setting of forza.toml has a page in Settings (frame rate, display,
keyboard and mouse bindings, online server, profile, Xenia save import).

Details: docs/launcher.md. The steps below are the same build by hand.

Building (Linux)

# 1. The ReXGlue SDK nightly, unpacked to ~/rexglue-sdk-nightly/0.10.0.24/linux-amd64

2. The game files, extracted from your Games on Demand package (only read)

python3 tools/xcontent_extract.py /path/to/4D5309C9/00007000/<name> extract extracted/game

3. The patched Xenos GPU plugin and codegen tool (clones the SDK to ~/rexglue-sdk-src-forza,

applies patches/rexglue-sdk/ and installs an overlay at ~/rexglue-sdk-patched-forza;

the stock rexglue's dot products overflow to infinity, Xenon's to QNaN, and free roam

crashes without it)

tools/build_rexglue_sdk.sh

4. Configure (the first configure runs codegen with the overlay's rexglue, about a

minute) and build

cmake -S forza-recomp -B forza-recomp/out/build/linux -G Ninja -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_PREFIX_PATH=$HOME/rexglue-sdk-nightly/0.10.0.24/linux-amd64 ninja -C forza-recomp/out/build/linux

Title Update 4 (needed for Horizon Rally and the 1000 Club; recommended): apply the update to your default.xex (about 2 s; it writes the patched executable, the two facade DLLs and the update's media.zip to extracted/tu4/) and build the TU4 version next to the base one. It has its own hints (hints_tu4/) and generated code (generated_tu4/); a full build is about 4 minutes at -j4 on 8 cores. git checkout forza-recomp/generated/rexglue.cmake afterwards if codegen shows it modified.

python3 tools/apply_title_update.py extracted/game/default.xex /path/to/<title update package or zip> extracted/tu4/default.xex
cmake -S forza-recomp -B forza-recomp/out/build/linux-tu4 -G Ninja -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_PREFIX_PATH=$HOME/rexglue-sdk-nightly/0.10.0.24/linux-amd64 \
  -DFORZA_TITLE_UPDATE=4
ninja -C forza-recomp/out/build/linux-tu4

The launcher does all of this from the two packages (above).

Windows

The Windows version is cross-compiled from Linux with clang/clang-cl and lld-link, after the Linux build above (its codegen output in forza-recomp/generated/ is reused, and step 3 checks out the SDK source). tools/build_windows.sh builds the ReXGlue SDK for Windows from ~/rexglue-sdk-src-forza with this project's patches and the Vulkan backend into ~/rexglue-sdk-patched-forza/0.10.0.24/win-amd64, then the game, and packages it in forza-recomp/out/dist/windows (--sdk-only and --game-only split the long build):

brew install llvm lld                                  # clang, clang-cl, lld-link
xwin --accept-license splat --output ~/.local/opt/xwin/sdk   # MSVC CRT + Windows SDK (Microsoft's license)
tools/build_windows.sh
tools/package_linux.sh                                 # the Linux package, forza-recomp/out/dist/linux

On Windows, extract the package, install the Microsoft Visual C++ 2015-2022 x64 redistributable, extract your game files with python xcontent_extract.py and run play.bat C:\path\to\extracted\game (--offline for no Xbox LIVE; it starts a local Forza Live server when Python is installed, or uses FORZA_SERVER / live_server in forza.toml). Saves, the online identity and the log go to Documents\forza.

Playing

tools/play.sh                 # play with your own profile (~/.local/share/forza)
tools/play.sh --xenia         # continue your Xenia Canary save (a copy)
tools/play.sh --offline       # without Xbox LIVE
tools/play.sh --base          # the base game instead of Title Update 4

play.sh runs the Title Update 4 build (forza-recomp/out/build/linux-tu4) when it exists and the base build otherwise. TU4 converts a profile save when it loads it (ForzaProfile/VersionFlags, a NeedsAA file), and the base build then refuses that profile ("MISSING TITLE UPDATE"): --base is for profiles that never ran on TU4, and a copy of the profile folder lets you go back.

Install DLC once with python3 tools/install_dlc.py /path/to/4D5309C9/00000002 (STFS packages, or a Xenia content folder with the DLC extracted; the launcher's DLC step takes both). Controllers, saves, the Xenia save import and more are in docs/playing.md.

Playing online

play.sh starts a local Forza Live server for the session. To play on the public server, set in forza.toml next to the binary:

live_server = "forza-reimagined.playit.plus:56677"

(or start with FORZA_SERVER=forza-reimagined.playit.plus:56677). You forward no ports. To run your own server, see docs/hosting.md.

More documentation

docs/PROJECT.md (status log, findings, debugging recipes), docs/playing.md, docs/hosting.md, docs/perf.md, docs/framerate.md, and the issue tracker (known bugs and planned work).

Community

Questions, help with setup and online sessions: Discord. Bugs and feature requests: issues (the bug report template asks for your OS, GPU and log).

Legal

Forza Horizon is © Microsoft. This project is not affiliated with, endorsed by or sponsored by Microsoft, Playground Games or Turn 10 Studios. It contains no game code or assets; you must own the game. See LICENSE.

Chat with me