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)
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/) and the infrastructure (infra/) are kept in separate
directories so their logic stays cleanly separated; both are orchestrated by the
root Makefile.
Building & Running
Requires Odin with the bundled raylib
vendor bindings. The web build additionally requires Emscripten
(emcc). 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
make clean # remove build artifacts
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 three categories:
- Infra dependencies —
infra/go.mod(gomodmanager); minor/patch updates grouped into a single PR. - Submodules —
lib/submodules via.gitmodules(git-submodulesmanager). - Workflow actions — action versions in
.gitea/workflows/*.yml(github-actionsmanager, which understands Gitea's.gitealayout).