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
| Tool | Version | Notes |
|---|---|---|
| CMake | 3.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++ compiler | C++23 | GCC 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. |
| Ninja | optional | Any CMake generator works; Ninja is what the project's own trees and CI use. |
| git | any recent | To 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
| Repository | Needed for |
|---|---|
cna | Always. 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-engine | Always. Configure stops with "cna-engine not found" without it. |
easy-gl, meta-gl, sharp-runtime | Always: CNA expects them next to itself (../easy-gl, ../sharp-runtime; easy-gl expects ../meta-gl). |
mobile-eggbert | Only 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. |
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
- The CMake target is
GalaxyEggbertCNA; the file it produces isGalaxyEggbert(GalaxyEggbert.exeon Windows,GalaxyEggbert.htmlon the web). OPENGL33is the renderer the maintainer plays with. Leave the option out and you get the project's native default,OPENGLES3; both are verified on Linux.- Run the game from its build directory: it reads
Content/,worlds3d/,textures3d/andavatars3d/by relative paths, and a post-build step copies them there. Running the Game explains why and lists every command-line flag.
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
- F1 shows the controls; Esc pauses; F11 switches between window and full screen (the first run is windowed; the choice is remembered).
- Walk with WASD or the arrows, jump with Left Ctrl, act with Space. Gamepads are supported (checked with SDL's virtual gamepad; no physical pad has been tried yet). All bindings are on Controls.
- The main menu's Setup holds the sound, the 3D effects (Off to Ultra), the frame rate and the textures (Configuration, 3D Effects & Graphics).
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
Tutorial: Building
The same path step by step, with tests and the web build.
Build Guide
Linux, the runtime bundle, web, Android, Windows, CI.
Running the Game
Command-line flags, the player's files, headless runs.
Configuration
CMake options, environment variables, Setup settings.
Gameplay
What there is to play.
Architecture
How the code is organised, for developers.