Interactive browser-based solar system visualization
See the codeMinimal Vite + React + TypeScript app that renders a solar system visualization using real space geometry data from NAIF (NASA’s Navigation and Ancillary Information Facility).

From repo root:
pnpm installpnpm run devThis viewer ships a small set of NAIF Generic Kernels as static assets under public/static/kernels/naif/:
lsk/naif0012.tls (LSK)pck/pck00011.tpc (PCK)spk/planets/de432s.bsp (SPK)These kernel files are redistributed unmodified, consistent with NAIF's rules: https://naif.jpl.nasa.gov/naif/rules.html
From repo root:
pnpm run format (auto-format)pnpm run format:check (CI)pnpm run lintpnpm run lint:fixpnpm run buildpnpm run typecheckpnpm run testJ2000.J2000, treat it as a right-handed inertial frame).et is ephemeris time in seconds past the J2000 epoch.number (EtSeconds).positionKm).velocityKmPerSec).radiusKm).SPICE scales are huge for typical WebGL scenes.
1 threeUnit = 1,000,000 km (kmToWorld = 1 / 1_000_000)Tune this depending on camera near/far planes, desired look, and precision.
WebGL vertices end up in 32-bit float space; solar-system-scale positions (e.g. 1 AU in km) lose fine detail when used directly as world coordinates.
J2000) relative to a stable observer (we use SUN).SpiceClient.getFrameTransform({ from, to, et }) returns a Mat3 rotation matrix.
number[9] in column-major order to match Three.js Matrix3.m = [ m00, m10, m20, m01, m11, m21, m02, m12, m22 ]c0=(m00,m10,m20), c1=(m01,m11,m21), c2=(m02,m12,m22).The transform is intended to be applied as:
v_to = M(from->to) * v_fromPlaywright e2e tests live in e2e.
From repo root:
pnpm run e2eTypeScript
90.1%
CSS
6.1%
JavaScript
3.5%
Interactive browser-based solar system visualization
See the codeMinimal Vite + React + TypeScript app that renders a solar system visualization using real space geometry data from NAIF (NASA’s Navigation and Ancillary Information Facility).

From repo root:
pnpm installpnpm run devThis viewer ships a small set of NAIF Generic Kernels as static assets under public/static/kernels/naif/:
lsk/naif0012.tls (LSK)pck/pck00011.tpc (PCK)spk/planets/de432s.bsp (SPK)These kernel files are redistributed unmodified, consistent with NAIF's rules: https://naif.jpl.nasa.gov/naif/rules.html
From repo root:
pnpm run format (auto-format)pnpm run format:check (CI)pnpm run lintpnpm run lint:fixpnpm run buildpnpm run typecheckpnpm run testJ2000.J2000, treat it as a right-handed inertial frame).et is ephemeris time in seconds past the J2000 epoch.number (EtSeconds).positionKm).velocityKmPerSec).radiusKm).SPICE scales are huge for typical WebGL scenes.
1 threeUnit = 1,000,000 km (kmToWorld = 1 / 1_000_000)Tune this depending on camera near/far planes, desired look, and precision.
WebGL vertices end up in 32-bit float space; solar-system-scale positions (e.g. 1 AU in km) lose fine detail when used directly as world coordinates.
J2000) relative to a stable observer (we use SUN).SpiceClient.getFrameTransform({ from, to, et }) returns a Mat3 rotation matrix.
number[9] in column-major order to match Three.js Matrix3.m = [ m00, m10, m20, m01, m11, m21, m02, m12, m22 ]c0=(m00,m10,m20), c1=(m01,m11,m21), c2=(m02,m12,m22).The transform is intended to be applied as:
v_to = M(from->to) * v_fromPlaywright e2e tests live in e2e.
From repo root:
pnpm run e2eTypeScript
90.1%
CSS
6.1%
JavaScript
3.5%