Windowstead is a tiny Godot 4 desktop-overlay colony sim. Contributions are welcome — this is a small, focused project and easy to jump into.
- Godot 4.2.2 (editor or command-line). The repo ships a Linux binary at
.tools/Godot_v4.2.2-stable_linux.x86_64for quick local testing. - A text editor or IDE with GDScript support.
- Git (for PRs).
# Using the shipped Linux binary
./.tools/Godot_v4.2.2-stable_linux.x86_64 --path .
# Headless smoke test (automated)
./.tools/Godot_v4.2.2-stable_linux.x86_64 --headless --path . --script res://tests/test_runner.gdproject.godot # Godot project root
scenes/main.tscn # Main UI scene (grid, sidebar, HUD)
scripts/main.gd # Core game loop, rendering, worker AI
scripts/game_state.gd # Save/load autoload singleton
theme/theme.tres # Theme resources
tests/test_runner.gd # Headless smoke tests
export_presets.cfg # Linux/Windows/macOS export presets
The game is intentionally monolithic: one scene, two scripts. Everything lives in main.gd — the tick loop, worker task selection, rendering, and UI wiring. game_state.gd handles persistence (desktop user:// or web localStorage).
- Branch from
main. Use descriptive names:fix/issue-NN-short,feat/short-description. - Make one focused change. Windowstead is small, but scope discipline keeps PRs reviewable.
- Smoke test before pushing. Run the headless test at minimum. If you touch rendering or UI, launch the editor and verify the game runs.
- Open a PR. Link the issue number in the PR body.
The smoke test runs the game headless and exercises the save/load cycle:
./.tools/Godot_v4.2.2-stable_linux.x86_64 --headless --path . --script res://tests/test_runner.gdIf your change touches persistence, add a corresponding test to tests/test_runner.gd.
- PRs target
main. - Link the related issue in the PR description.
- Keep descriptions concise: what changed and why.
- No merge conflicts expected on
main— pull before pushing.
- GDScript idioms:
const,var,func,@onreadyfor node references. - Use
String()casts when concatenating with+or%formatting. - Keep
main.gdreadable — it's ~800 lines of dense logic. Comments help.
Check the issues for open work. Small fixes are great starting points. If you want to propose something new, open an issue first.