GalaxyJS
Eighty-six cosmic scenes. Nothing to install.
The starscape behind this is the real engine — running live
A cosmic engine that drops into anything.
No framework. No build step. No required dependencies. One <script> tag and one call put 86 hand-tuned canvas, WebGL2 and three.js scenes into a React app, a Vue app, or a plain HTML file. The hard part wasn't drawing stars — it was making the whole thing feel weightless: small, fast, portable, and accessible by default.
Why a Product Designer built an animation engine: To eliminate the persistent friction where brand/marketing desires high-impact motion, but engineering rejects it over Core Web Vitals (LCP/INP) and mobile battery drain. GalaxyJS proves that sensory luxury and strict performance governance can be unified in a zero-dependency contract.
Modelled-vs-measured: 86 scenes and the 72 / 8 / 6 renderer split are catalog counts from the tagged v3.4.0 release, not product-outcome metrics. ~69 kB gzip is the measured payload on the jsDelivr pin. Zero required dependencies is a browser-runtime contract — three.js is optional and lazy.
Don't take my word for it. Drive it.
This panel is the actual library, running live. Pick a scene — the engine mounts it on a HiDPI canvas, runs it on the shared frame loop, and would pause it the moment you scrolled away. The case study is the demo.
shared rAF · dpr-aware · auto-pause
Select a scene
Telemetry
scenes · —
theme · token-based, dual
extend · registerAnimation()
Eighty-six scenes. All real.
A few of the catalog, each a separate live instance. They only animate while on screen — scroll past and they sleep. The six leading tiles are the newest work: three.js scenes on an optional tier, doing what canvas and a fragment shader cannot.
A library gets heavy by making everyone pay for its most expensive feature. So the tiers are graded, and the top one is opt-in: three.js is fetched only if you mount one of the six scenes that need it — once per page, shared. Mount none and you download nothing extra. If it cannot load at all, the surface paints a still poster rather than an empty box.
Galaxy.useThree(THREE) // bring your own — zero network
Performance is a feature.
Eighty-six scenes could mean eighty-six timers fighting the CPU. They don't. Every scene shares one requestAnimationFrame loop, each canvas is device-pixel-ratio aware so it stays crisp on retina, and an IntersectionObserver pauses anything scrolled offscreen. A token-based theme drives colour, and registerAnimation() lets anyone add an 87th scene without touching the core.
The cosmos holds still when asked.
Every animation honors prefers-reduced-motion — instead of moving, it renders a single composed static frame. Motion sensitivity shouldn't mean a blank box; it should mean a still, beautiful one. A test in CI keeps that promise.
This page honors it too — turn on Reduce Motion and the boot sequence skips, the reticle cursor returns to default, and every cosmic scene freezes to one frame.
A drop-in tag — or an agent's call.
A human adds one script and ships. But GalaxyJS also carries the machine layer: an MCP server, hand-written TypeScript types, a generated manifest, and an llms.txt. So an AI agent in Claude Desktop or Cursor can discover all 86 scenes — and which of the three renderer tiers each needs — and wire one into a page from a structured contract — the same instinct behind its sibling registry, ReactΩ.
One author, two engines.
GalaxyJS and ReactΩ are deliberately separate — different stacks, different problems, the same discipline underneath.
Vanilla cosmic engine
Framework-free canvas animations + UI kit you drop into any page.
- Plain JS · no framework · no build
- One <script> / CDN drop-in
- 86 scenes · single shared rAF
- Reduced-motion by contract
React component registry
Copy-paste motion, interaction & physics components you own — AI-native.
- React + TypeScript + Tailwind
- Registry + CLI + shadcn + MCP
- 57 components you own outright
- Reduced-motion by contract
Not a demo. Shipped.
Tagged release — 86 animations across three renderer tiers, immutably pinned on jsDelivr. Release notes ↗
All 86 scenes + the UI kit, native on GitHub Pages. edwson.github.io/GalaxyJS ↗
Syntax + eslint, a true minified build, a manifest-drift gate, and a real end-to-end MCP test — green on every push.
Engine, UI kit, MCP, and docs shipped end-to-end with an AI pair — disclosed openly. Honest ~69 kB, measured not guessed.
I engineered an experience to feel effortless.
Anyone can draw a starfield. The craft was making eighty-six of them feel weightless — one frame loop, dpr-crisp, auto-paused, ~69 kB, and still beautiful when motion is switched off — and then making the whole thing installable by a person or an agent. Performance, portability, and accessibility weren't constraints on the product. They were the product.