Complete contribution flow
Create a branch
Always work on a dedicated branch — never commit directly to Branch names should be short and descriptive. Use hyphens as separators.
base:Ask questions early
Before investing significant time, ask in Discord or open a draft PR describing your approach. It is always better to ask than to rewrite a large implementation.
Write code and commit
Make small, focused commits with meaningful messages. See Commit messages below.
Set up the dev environment
Install dependencies and build locally, or use the Docker dev environment. See Dev environment setup.
Test your changes
Run the test suite before submitting. See Testing for details.
Open a pull request
Push your branch and open a PR against
LandSandBoat/server:base. Fill in all template checkboxes. Open as a Draft if the work is still in progress.Commit messages
Commit messages should be meaningful. Amend or rebase local commits before pushing if the history is noisy.Citing sources
Always cite your sources. Put citations in code comments or commit messages — not only in PR descriptions, which get lost over time:Crediting co-authors
If you are committing work done on someone else’s behalf, give them credit using git’s--author argument or GitHub’s Co-Authored-By trailer:
Dev environment setup
Prerequisites
- CMake ≥ 3.25
- A C++20 compiler: GCC 14, Clang 20, MSVC (VS 2025), or Apple Clang
- Python 3 + pip
- MariaDB (for database)
- Git
Install Python dependencies
Build with CMake
Environment variables
Database credentials can be passed as environment variables, avoiding the need to edit settings files:Local CI with Docker
Thedev.docker-compose.yml file mirrors the CI environment and lets you run all checks locally without a local C++ toolchain.
Available services
| Service | Description |
|---|---|
database | MariaDB LTS instance |
build | Compiles the project with GCC in Debug mode |
sanity_checks | Runs shell-based sanity checks against origin/base |
lls | Runs the Lua Language Server check |
clang_tidy | Builds with Clang and runs clang-tidy, outputs log/clang_tidy_summary.md |
setup_database | Runs dbtool.py update to populate the database |
test | Runs xi_test --keep-going |
startup_checks | Runs startup validation checks |