Try it live About this project
Planet Maker is an offline-first 3D planet editor that runs in the browser: pick one of nine worlds from Mercury to the Moon, or upload your own 2:1 map to start a new planet; sculpt relief, tune clouds and atmosphere, aim the sun, then place 3D objects, pin markers and billboard text on the sphere — everything lands oriented to the curved surface.
Twenty lightweight CC0 models come bundled, and a Tripo creation entry is built in: generate a custom model in Tripo, upload the GLB and click the sphere to place it. Everything stays in the browser (no account, no backend); finished worlds export as PNG snapshots, GLB scenes or re-editable .planet.json projects, and once installed as a PWA with the offline library downloaded, creation continues with no connection at all.
Highlights
- Start from nine worlds — Mercury to the Moon — or upload any image, cropped locally into a 2:1 equirectangular surface map
- Surface relief, roughness, clouds, atmosphere, auto-rotation and sun direction are all slider-tunable
- Twenty CC0 models built in; generate a custom model with Tripo, upload the GLB and click the sphere to place it — always oriented flush with the surface
- Export a PNG snapshot, GLB scene or re-editable .planet.json project in one click; install as a PWA and keep creating fully offline
Technical breakdown
GLB object pipeline · Tripo output straight onto the sphere
The Objects panel ships a built-in Tripo creation entry — generate a custom model in Tripo, upload the GLB and it just works. Every GLB (the 20 bundled CC0 assets included) is first normalized by its Box3 bounding box: centered, bottom-anchored at the origin, uniformly scaled by its longest edge. On placement, spherical coordinates convert into a position and quaternion, so one click plants the object flush with the ground at any latitude.
Planet rendering · one texture, physical materials
The whole planet runs on a single 2:1 map: meshPhysicalMaterial uses it as both color and bump map (bumpScale is the relief slider). Clouds live on a separate alpha-mapped shell (Venus gets a solid special case), the atmosphere is an additive BackSide glow shell, and Saturn adds a ringGeometry; sun azimuth and elevation drive the directional light, and shadows follow.
Custom surfaces · processed entirely locally
Uploaded images never touch a server: createImageBitmap reads the file, center-crops it to 2:1, caps the width at 2048px, then canvas-encodes a webp into localStorage. Uploaded custom GLBs use in-memory object URLs and are deliberately kept out of the project JSON. No account, no backend — projects live with the browser data.
Performance and offline · render-on-demand + PWA
The frameloop runs only when needed: switch off auto-rotation and it drops to demand mode, hide the tab and it halts entirely, with automatic dpr regression under load. vite-plugin-pwa precaches the app shell and starter assets, and “Download offline library” in the Export panel caches all nine planets and twenty models — planet-making continues with no connection at all.


