Getting Started

What you need, the shortest path from empty folders to a running game, and where to go next.

To play, download a release (Releases: Windows, Linux, Android and the web). To build Galaxy Eggbert from source, you check out the game and the libraries it is built on side by side, configure it with CMake and run the result from its build directory. Linux is the verified desktop platform (as of 2026-11-12); the web, Android and Windows builds are covered in the Build Guide and their status in Platform Support.

Toolchain

ToolVersionNotes
CMake3.21 or newer; in practice 3.23+The game declares 3.21, but its graphics dependencies easy-gl and meta-gl declare 3.23.
C++ compilerC++23GCC or Clang. The project sets CMAKE_CXX_STANDARD 23; the maintained Linux build uses GCC 14, CI the default compiler of GitHub's ubuntu-latest image.
NinjaoptionalAny CMake generator works; Ninja is what the project's own trees and CI use.
gitany recentTo clone the game and its sibling repositories.
Network on first configure-With tests enabled, CMake downloads GoogleTest v1.14.0 (see Configuration to use a local copy).

Repositories

The game is compiled against CNA (a C++ reimplementation of the XNA 4.0 API) and cna-engine (its helper modules) as source, through add_subdirectory. CNA in turn needs three more checkouts. All of them sit next to galaxy-eggbert in one parent folder:

any-folder/
├── galaxy-eggbert/     the game
├── cna/                CNA (github.com/libcna/cna)
├── cna-engine/         helper modules (github.com/libcna/cna-engine)
├── easy-gl/            CNA's GL layer (github.com/libcna/easy-gl)
├── meta-gl/            needed by easy-gl (github.com/libcna/meta-gl)
├── sharp-runtime/      CNA's .NET-style runtime (github.com/libcna/sharp-runtime)
└── mobile-eggbert/     optional: only its worlds/ folder, for two tests
RepositoryNeeded for
cnaAlways. Configure stops with "CNA not found" without it. Its own git submodules (SDL3, SDL3_mixer and a few more) must be initialised; the first configure builds SDL from them, which takes several minutes.
cna-engineAlways. Configure stops with "cna-engine not found" without it.
easy-gl, meta-gl, sharp-runtimeAlways: CNA expects them next to itself (../easy-gl, ../sharp-runtime; easy-gl expects ../meta-gl).
mobile-eggbertOnly the tests VerifyMoveObjectTypesCna and VerifyBigDecorParsingCna (they read ../mobile-eggbert/worlds/*.txt) and some Python tools. Not needed to build or play. CI checks out only its worlds/ folder; the whole repository is about 2.3 GB.
Not submodules. The siblings are plain checkouts, not git submodules: galaxy-eggbert has no .gitmodules file, so the git submodule ... commands in its README.md and ANDROID.md do nothing. Clone each sibling yourself. Only cna has submodules of its own.

Other locations are possible: -DCNA_HOME=<path> and -DCNA_ENGINE_HOME=<path> point the game at CNA and cna-engine elsewhere (Configuration). The exact revisions CI builds against are pinned in .github/workflows/cna-ci.yml; when the newest CNA does not build, use those.

System packages

On Debian or Ubuntu these are the packages the CI job installs (SDL's audio, X11, Wayland and input back ends, the GL headers, FFmpeg for music, and libcurl/nlohmann-json for CNA's networking modules):

sudo apt-get install -y --no-install-recommends \
  build-essential ninja-build pkg-config ccache \
  libasound2-dev libpulse-dev libaudio-dev libfribidi-dev libjack-dev \
  libsndio-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev \
  libxfixes-dev libxi-dev libxss-dev libxtst-dev libxkbcommon-dev \
  libdrm-dev libgbm-dev libgl1-mesa-dev libgles2-mesa-dev \
  libegl1-mesa-dev libdbus-1-dev libibus-1.0-dev libudev-dev \
  libthai-dev libwayland-dev wayland-protocols libdecor-0-dev \
  libavcodec-dev libavformat-dev libavutil-dev libswresample-dev \
  libcurl4-openssl-dev nlohmann-json3-dev

Optional: xvfb-run (headless runs and the demo-replay test), Python 3 with numpy and Pillow (asset tools), the Emscripten SDK (web build), Android Studio with SDK 35, NDK 29.0.14206865 and JDK 17 or 21 (Android build).

The shortest path to a running game (Linux)

mkdir eggbert && cd eggbert
git clone https://github.com/openeggbert/galaxy-eggbert.git
git clone https://github.com/libcna/cna.git
git -C cna submodule update --init          # SDL3, SDL3_mixer, ... (not recursive)
git clone https://github.com/libcna/cna-engine.git
git clone https://github.com/libcna/easy-gl.git
git clone https://github.com/libcna/meta-gl.git
git clone https://github.com/libcna/sharp-runtime.git

cd galaxy-eggbert
cmake -S . -B build-cna-opengl3 -G Ninja \
  -DCMAKE_BUILD_TYPE=Release -DCNA_GRAPHICS_RENDERER=OPENGL33
cmake --build build-cna-opengl3 --target GalaxyEggbertCNA --parallel 4

cd build-cna-opengl3
./GalaxyEggbert

On the first start the game prints where it keeps your files, for example GalaxyEggbertCNA: the player's files are in /home/you/.local/share/Galaxy Eggbert: settings and progress (savedata.txt), an interrupted mission (resume.txt), your demo recordings (demos/) and your own worlds (customworlds/).

Your first minutes in the game

Checking the build

To run the test suite, build every target (the tests are separate executables) and run ctest. Clone mobile-eggbert first, or two tests fail:

cmake --build build-cna-opengl3 --parallel 4
ctest --test-dir build-cna-opengl3 --output-on-failure

All tests pass on the maintained tree (120 of 120 on 2026-11-10). Details in the Build Guide and Testing.

Where to go next