Go to file
Steve Biedermann d3a230bd47 docs: document setup and database options 2026-10-08 09:17:22 +02:00
src feat: add same-seed reset and world regeneration 2026-10-08 09:10:42 +02:00
ui feat: add same-seed reset and world regeneration 2026-10-08 09:10:42 +02:00
.dockerignore feat: add database persistence and Docker setup 2026-10-08 09:10:42 +02:00
.gitignore feat: add database persistence and Docker setup 2026-10-08 09:10:42 +02:00
Cargo.lock feat: add same-seed reset and world regeneration 2026-10-08 09:10:42 +02:00
Cargo.toml feat: add same-seed reset and world regeneration 2026-10-08 09:10:42 +02:00
Dockerfile feat: add database persistence and Docker setup 2026-10-08 09:10:42 +02:00
Justfile feat: add same-seed reset and world regeneration 2026-10-08 09:10:42 +02:00
README.md docs: document setup and database options 2026-10-08 09:17:22 +02:00
build.rs build: bundle the Leptos UI during Cargo builds 2026-10-08 09:10:42 +02:00
compose.yaml feat: add database persistence and Docker setup 2026-10-08 09:10:42 +02:00

README.md

World Simulation

A browser-based world simulation with a Rust server and a Leptos/Wasm UI. The server runs the simulation and exposes its state over HTTP and WebSockets. You can edit terrain and resources, manage people and animals, and customize agent behavior with the included Rune script.

The UI is built automatically as part of cargo run and embedded in the server binary. There is no separate manual UI build step.

Getting Started

Local run with SQLite

Install Rust with rustup. The build script installs the wasm32-unknown-unknown target if it is missing. Then run:

cargo run

Open http://127.0.0.1:7878. The default database is SQLite at sim.db in the current directory, and the initial seed is 42.

To choose a seed on the first run:

cargo run -- 123

An existing database snapshot takes precedence on later runs, including over a new command-line seed. Use the UI's Reset button to start a fresh world with its current seed, or Regenerate to choose a different seed.

Run with Just

Install Just, then list the project recipes:

just

Useful recipes:

just run          # Run locally with the default SQLite database
just run-release  # Run an optimized local build
just sqlite       # Explicitly select sim.db for local testing
just docker-build # Build the application image
just compose-up   # Build and start the app and Postgres in the background
just compose-down # Stop the Compose services; keep the database volume

Run with Docker Compose and Postgres

Install Docker with the Compose plugin, then run:

docker compose up --build -d

Open http://localhost:7878. Compose waits for Postgres to become healthy before starting the app. Postgres data is stored in the postgres_data volume and survives container restarts and docker compose down.

To remove the database volume and all saved simulation data as well:

docker compose down -v

The Compose file uses development-only database credentials. Change them before exposing the service beyond a trusted local environment.

Database Configuration

The server selects its database through DATABASE_URL:

Backend Example URL
SQLite (default) sqlite://sim.db?mode=rwc
Postgres postgres://sim:sim@localhost:5432/sim

For example, run locally against a reachable Postgres server with:

DATABASE_URL=postgres://sim:sim@localhost:5432/sim cargo run

The simulation is saved as a snapshot about once per second and restored at startup. SQLite is convenient for local testing; Compose configures the app to use Postgres.

SIM_ADDR sets the listen address. It defaults to 127.0.0.1:7878; containers set it to 0.0.0.0:7878.

Project Layout

  • src/world.rs contains the simulation and snapshot serialization.
  • src/main.rs runs the Axum server, simulation thread, and HTTP/WebSocket API.
  • src/storage.rs provides SQLite and Postgres snapshot storage.
  • src/behavior.rn is the default Rune behavior script.
  • ui/ contains the Leptos frontend, compiled to Wasm by build.rs.
  • Dockerfile, compose.yaml, and Justfile provide container and developer workflows.

Tests

Run the server tests with:

cargo test --bin sim