A procedural solar system generator and browser-based renderer for a space colonization game. Runs entirely client-side — the deployed site on GitHub Pages is a static bundle.
Two components:
- Seeder — pure TypeScript that procedurally generates solar systems. Runs in the browser (bundled via esbuild) and as a Deno CLI for writing JSON seed files to disk.
- Renderer — vanilla JS + HTML pages for generating, browsing, and viewing systems (2D canvas and 3D Three.js).
Requires Deno v2+.
deno task renderer
This builds the browser bundle (renderer/generator.bundle.js), starts a dev
server at http://localhost:8080, opens your browser, and watches:
renderer/→ triggers a browser reload on change.seeder/→ rebuilds the bundle, then triggers a reload.
deno task seed [seed] [--json [folder]]
- Without arguments: generates a random system and prints stats.
- With an integer: generates that seed deterministically.
--json: exports toseeds/(or a folder you name).
Examples:
deno task seed
deno task seed 42
deno task seed 42 --json
deno task seed 42 --json ./exports
deno task test
deno task build
Produces renderer/generator.bundle.js. Rarely needed manually — the renderer
task handles it.
The site is deployed automatically on every push to main by
.github/workflows/pages.yml.
One-time setup on a new repo: in Settings → Pages, set Source: GitHub Actions.
The deployed site is fully client-side:
- All system generation runs in the browser using the bundled seeder.
- Seeds are persisted to
localStorageper origin. (The localhost origin and thegithub.ioorigin maintain separate libraries.) - Routes are hash-based:
seed.html#<seed>,canvas.html#<seed>. Sharing a seed URL is enough to reproduce the system — generation is deterministic from the seed. - No server runs in production. The
./ssehot-reload endpoint fails silently there, which is intentional.
| Page | Purpose |
|---|---|
index.html |
Generator + scroll-snap library of seeds saved in localStorage |
seed.html#<seed> |
3D orrery view |
canvas.html#<seed> |
2D canvas view |
| File | Role |
|---|---|
seeder/generator.ts |
Core generation logic — star, planets, moons, deposits |
seeder/config.ts |
Default config, archetype weights, settlement config |
seeder/rng.ts |
Seeded PRNG, name generator |
seeder/types.ts |
Shared TypeScript types |
seeder/main.ts |
CLI entry point (Deno only) |
seeder/browser-entry.ts |
Bundle entry — re-exports pure functions for the browser |
build.ts |
esbuild bundler, builds renderer/generator.bundle.js |
server.ts |
Local dev server (static + SSE + rebuild on seeder changes) |
renderer/*.html |
Page views |
renderer/scene.js |
3D orrery (Three.js) |
renderer/canvas-scene.js |
2D canvas orrery |
renderer/panel.js, canvas-panel.js |
System info panels |
renderer/storage.js |
localStorage wrapper |
.github/workflows/pages.yml |
CI: build + deploy to GitHub Pages |
The CLI writes to seeds/ by default; seeds/*.json is gitignored (the folder
itself is tracked via .gitkeep). Commit specific files manually if you want to
share them. The deployed site does not read these — only localStorage.