Files
horizon-airdef/docs
Ludovic Marie de464a8fc0 Play with friends without a server: endpoints and key in the code
Ludovic can't pay for a hosted relay, so nothing depends on one now. The
host's game finds how it can be reached on its own: its interface
addresses (LAN, VPNs such as Tailscale or ZeroTier, IPv6), a port opened
on the router for an hour at a time (PCP, then NAT-PMP, then UPnP IGD;
renewed while sharing, deleted on stop) and its public address from STUN
(Cloudflare's and Google's public servers by default, configurable). The
invite code carries those endpoints and an 80-bit secret in base32 groups
with a checksum; guests dial every endpoint at once and run the same
SPAKE2 + ChaCha20-Poly1305 handshake, no rendezvous involved. When nothing
can reach the host it says why and what to do (UPnP, the port to forward,
a relay, a VPN; CGNAT and double NAT detected).

The relay stays as something anyone can run (binary, Dockerfile, systemd
unit; Railway config removed): with one configured the host also gets a
short code, and the full code names the relay so guests fall back to it.
No relay by default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 03:05:54 +02:00
..

Horizon documentation

To play, use the launcher; the project site is playhorizon.dev. These pages are for developers.

Build and run

  • Build from source: your own copy of the game, resource preparation, cargo run.
  • Native client: options, controls, the dedicated server, horizon-ctl scripting, packaging, architecture.
  • Graphics: the Simple and Advanced graphics settings, the graphics benchmark and what it measured.
  • Extras: optional zoom, minimap, FPS and keystroke overlays and auto-reconnect, all off by default.
  • Launcher: installs, updates and starts builds; its CLI and MCP server; releasing it.
  • Opt-in data collection: the consent, exactly what is sent, how it is stored and sent.
  • Menus: the title, world list, create world, multiplayer, options and pause screens share the launcher's design tokens and fonts (crates/horizon-theme), drawn by ui_theme over a live frozen backdrop (game/backdrop.rs, blurred and graded by post.rs). Options → Interface → Menu style switches to vanilla's screens (Classic, kept in horizon.txt; HORIZON_MENU_STYLE=horizon|classic overrides it, and scripted runs default to Classic). Title (webm), worlds, options, pause.

Parity

Architecture: world generation

Architecture: world data and simulation

The earlier Java track (no longer developed)