LyraCore is a World of Warcraft 1.12.1 server written in Rust on SpacetimeDB. All game state and rules live in the database. You add content with Packages, without editing core files, and players connect with an unmodified client.
Not ready for deployment. LyraCore is in an early phase of development and is not secure. Do not use it for a public realm.
- A World of Warcraft 1.12.1 client, build 5875. None is distributed here.
- Rust through rustup.
rust-toolchain.tomlpins 1.93.0, and rustup installs it on the firstcargocall. - The SpacetimeDB CLI, exactly version 2.7.1.
module/Cargo.tomlpins it, andlyracore preflightrefuses any other version.install.shoffers to install it.- A Linux or macOS machine or container. WSL is untested.
curl -sSfL https://raw.githubusercontent.com/LyraCoreProject/LyraCore/main/install.sh | sh
cd LyraCoreThe script puts the LyraCore folder in your current directory and a launcher for the
lyracore CLI in ~/.local/bin. It offers to
install Rust, SpacetimeDB 2.7.1 and wasm-opt if they are missing. Nothing needs root.
lyracore doctor # is this machine ready?
lyracore dev up # start the local realm
lyracore account create admin # a login for your clientPoint your client's realmlist.wtf at 127.0.0.1 and log in. The realm starts with a small seed
world. Import the real one next.
lyracore config set client-data <path-to-client-Data-folder>
lyracore importYou supply your own client's Data folder. After you confirm the prompt, lyracore import
downloads the pinned world-data dump from cMaNGOS classic-db,
verifies its checksum, and imports it together with data extracted from your client. You do not
need to download or configure a SQL dump yourself.
See the detailed import instructions for what the import loads and how long it takes.
Yes. An unmodified 1.12.1 client, build 5875, is the only client LyraCore supports. Nothing is patched, no launcher is replaced, and no addon is required. Other 1.12.x builds fail at the logon challenge or during the handshake.
A Package is a folder under packages/ that adds content to the realm. It can hold Runtime Scripts
in TypeScript or Lua, data changes, client addons, Rust code, or any mix of these.
lyracore packages new my-package # start your own
lyracore packages add playerbots # install an official one
lyracore packages apply # build and activate enabled PackagesThe official Packages live in LyraCoreProject/packages.
Applying packages explains what the command changes.
docs/package-api.md lists what a Package's Rust code may call.
A client never talks to SpacetimeDB. The gateway speaks the WoW protocol and turns each client
action into a reducer call. The realm runs on several databases that all run the same module.
docs/architecture.md has the details.
unmodified 1.12.1 clients (build 5875)
│ raw TCP · SRP6 · header-encrypted opcodes
▼
┌────────────────────────────────────────┐
│ GATEWAY (edge / protocol tier) │ TRUSTED · does ALL socket IO
│ SRP6 logon :3724 + realm list │ holds NO durable game state
│ world :8085 · header cipher · codec │ routes across databases
│ stdb/ · subscriptions · AOI · relays │ stateless, restartable
└────────────────────────────────────────┘
│ SpacetimeDB client: reducer calls ↑ subscription deltas ↓
▼
┌────────────────────────────────────────┐
│ SPACETIMEDB (authority) │ ALL state + ALL logic
│ world shards · instance pool │ transactional reducers
│ realm-core: accounts · sessions · │ same wasm on every database
│ groups · guilds · chat · loot rolls │ scheduled work drives the world
└────────────────────────────────────────┘
Anyone can open an issue or a pull request. Start with CONTRIBUTING.md. It
names the three required reads and explains how to file an issue or a pull request.
docs/quickstart.md goes from a clone to a connected client.
LyraCore is an independent implementation, not a fork or port of another emulator. It relies on knowledge and data from other projects: wowdev.wiki for wire formats, the gtker crates as dependencies, and vMaNGOS, cMaNGOS and mangoszero as references for which packets a client needs and in what order. Without these projects, none of this would be possible.
Dual-licensed under MIT or Apache 2.0, at your option.