Age of New Worlds
September 1, 2026 ยท View on GitHub
Important
This repository is no longer actively developed. Continued development has moved to ernestwisniewski/age-of-new-worlds.
Age of New Worlds is an open-source, turn-based 4X game built around a hex map. The shipping client uses Flutter and Flame, shared gameplay rules live in Dart, and online matches are hosted by Serverpod.
A Rust engine is being introduced incrementally under engine/. It already powers the experimental Godot client, but packages/aonw_core/ remains the production rules implementation until the migration gates are complete.
Public Links
| Destination | Link |
|---|---|
| Website | aonw.net |
| Architecture | Interactive map |
| Devlog | ernest.dev |
| GitHub | ernestwisniewski/aonw |
| iOS | App Store |
| Windows/Linux/macOS | Steam, itch.io |
| Android | Google Play, itch.io |
Repository
| Area | Purpose |
|---|---|
lib/game/ | Flutter client orchestration, UI, Flame rendering, persistence, and adapters. |
packages/aonw_core/ | Production Dart rules, protocol models, and AI. |
packages/aonw_server_client/ | Generated Serverpod client used by Flutter. |
server/ | Serverpod backend, authentication, multiplayer lifecycle, and persistence. |
engine/ | Rust workspace for the successor deterministic engine and native adapters. |
content/ | Versioned logical maps and scenarios shared with Rust and Godot. |
clients/aonw_flutter/ | Reserved final location for Flutter after the Dart engine is retired. The active app remains at the repository root. |
clients/aonw2_godot/ | Godot 3D presentation client and map workbench. Gameplay rules stay in Rust. |
docs/ | Architecture, gameplay contracts, quality policy, and runbooks. |
Quick start
Use the Flutter version pinned in .fvmrc. FVM is optional; Make uses .fvm/flutter_sdk automatically when it exists.
make bootstrap
make ci
make bootstrap installs the locked package graphs and the matching Serverpod CLI. It does not generate code, start Docker, or alter lockfiles.
Useful focused checks:
make analyze
make coverage-check
make architecture
make mutation
make critical-e2e-test
make performance
make generated-code-check
Run the Flutter client
For offline work, run the app with the normal Flutter tooling after bootstrap.
For the local multiplayer stack:
cp .env.example .env
# Replace every placeholder secret in .env.
make local-start
make local
The web client runs at http://localhost:7357 and the API at http://localhost:8080. Four local accounts are seeded as test1@example.test through test4@example.test; the shared development password is AonwTest123!.
Run the automated multiplayer smoke with:
make local-multiplayer-smoke
Stop the stack without removing its data:
make local-down
Rust and Godot
The Rust workspace and Godot client are separate from the shipping Flutter path.
make rust-check
make godot-check
make godot-editor
make godot-run
Read the migration plan before moving rules across the Dart/Rust boundary.
Documentation
Start with docs/README.md. It explains which implementation is authoritative, where each subsystem lives, and which checks apply to a change, including static analysis, critical journeys, mutation testing, and architecture budgets.
Contribution setup and pull-request expectations are in CONTRIBUTING.md. Architecture decisions are indexed in docs/adr/README.md.
Localization
English is the source language in lib/l10n/app_en.arb. The app also ships Polish, German, Spanish, Dutch, and French. Regenerate localization output with flutter gen-l10n after changing ARB files.
License
Code is released under the MIT License. Asset and dependency notices are listed in THIRD_PARTY_NOTICES.md.