DESI Explorer

An interactive 3D map of the universe, built from data gathered by the Dark Energy Spectroscopic Instrument (DESI).

Renders millions of galaxies / quasars in real time as a navigable 3D point cloud, combining Odin for the renderer with raylib for windowing, input, and 3D drawing.

What is this?

A fun personal project with three interlocking goals:

  • Turn DESI's survey into something you can fly through — the Dark Energy Spectroscopic Instrument maps a huge volume of the observable universe (galaxies, quasars, and the Lyman-alpha forest) in three dimensions. This project renders that data as an interactive 3D experience rather than a static plot.
  • Serve the data, not the download — the datasets are large, so the experience pulls from a centralized repository / API instead of requiring you to keep the raw catalogs locally (see Goals).
  • Ship to native and the web — one Odin codebase compiled to a native desktop executable and to WebGL/WASM, so the map runs anywhere.

Goals

  • Scaffold the project: Odin + raylib 3D renderer, Go/Pulumi infra, Gitea CI
  • Pull data from a centralized repository to limit storing all the DESI data locally
  • Be both a native executable and a WebGL-based interactive experience
  • Build utilizing the Odin language
  • (Future) Integrate with other space data to be able to incorporate both dark energy information and more

Current State

Early scaffolding. The application currently:

  • Opens a resizable 3D raylib window with an orbital camera (zoom + rotate + pan).
  • Renders a procedurally generated point cloud standing in for the galaxy catalog (real DESI data ingestion is the next milestone).
  • Compiles natively, to WebAssembly, and is deployed to an on-prem Kubernetes cluster as a placeholder web service.

Roadmap

  • Ingest real DESI data (EDR/DR1 catalogs) and map survey coordinates (RA / Dec / redshift) into 3D space
  • Central data repository / API so large catalogs aren't stored locally
  • Efficient rendering of large point clouds (instancing / vertex buffers rather than per-point draws)
  • Camera flight / goto-object controls and a minimap
  • Color-coding by redshift, survey, or object type
  • Object selection & metadata inspection
  • Web (WASM/WebGL) parity with the native build
  • (Future) Fold in other datasets for dark-energy context

Repository Layout

src/       Odin source — the interactive 3D experience (entrypoint: src/main.odin)
lib/       Third-party Odin dependencies (submodules / vendored libs)
api/       Rust backend API (axum) for serving DESI catalog data
infra/     Go + Pulumi infrastructure-as-code (deploys the experience to k8s)
scripts/   Build helpers (Odin install, WASM build)
.gitea/    Gitea Actions CI/CD workflows

The renderer (src/), the API (api/), and the infrastructure (infra/) are kept in separate directories so their logic stays cleanly separated; all are orchestrated by the root Makefile.

Building & Running

Requires Odin with the bundled raylib vendor bindings. The web build additionally requires Emscripten (emcc). The API requires Rust (stable toolchain, pinned via api/rust-toolchain.toml). The infrastructure requires Go and Pulumi.

All project commands live in the root Makefile (make help lists them):

make setup        # pull submodules + tidy Go deps
make run          # run the native app
make build        # -> bin/desi_explorer
make build-debug  # debug native build
make build-web    # -> build/web (wasm + html)
make test         # odin test + go test + cargo test
make clean        # remove build artifacts
make api-run      # run the Rust API server
make api-test     # cargo test
make api-check    # rustfmt check + clippy

Dependency Updates (Renovate)

Renovate keeps dependencies up to date by opening PRs. It runs centrally on the homelab Gitea — a dedicated renovate Gitea Actions runner in the homelab k3s cluster runs renovate every hour (renovate workflow in the homelab repo) with autodiscovery filtered to sam_oneal/*. Because this repo carries a renovate.json on main, it is picked up automatically. Config for this repo lives in renovate.json and is validated with make renovate-validate.

It manages four categories:

  • Infra dependenciesinfra/go.mod (gomod manager); minor/patch updates grouped into a single PR.
  • API dependenciesapi/Cargo.toml (cargo manager); minor/patch updates grouped into a single PR.
  • Submoduleslib/ submodules via .gitmodules (git-submodules manager).
  • Workflow actions — action versions in .gitea/workflows/*.yml (github-actions manager, which understands Gitea's .gitea layout).
S
Description
Explore all the universe has to offer!
Readme 335 KiB
Languages
Shell 32.2%
Makefile 25.3%
Rust 18.9%
Odin 10.1%
Go 8.5%
Other 5%